[devcontainer / Docker] containerが立ち上がる直前でエラーが発生する

# 概要

以下のような状況に陥ったので、同様の問題に出くわした方のために記事を書きました。

- devcontainerでコンテナを立ち上げる際にエラー発生
- docker imageのbuildまでは成功し、エラー発生はその直後
- 重要なエラーメッセージのありかが分からず、原因不明のまま数時間経過
- エラーメッセージさえ見つかれば即解決できた


# 環境

Mac OSのM2チップ搭載マシンで発生。

ただし、今回のエラーはたとえwindowsだとしても発生する。


# 症状

devcontainerを使ってフォルダを開くと、docker imageがbuildされる。
image build終了後は、containerが立ち上がるはずのところ、エラーが発生した。

具体的には、以下のように「**コンテナーの設定中にエラーが発生しました。**」というメッセージが表示された（ローカルPCがMacの場合）。

![スクリーンショット 2023-06-02 17.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/bc5f5e06-553d-6e20-dbca-0e120b569844.png)

これだけだと何もわからないので、「**ローカルでdevcontainer.jsonを編集**」ボタンを押下する。
すると、VSCode上で、`/Users/user_name/Library/Application Support/Code/logs/20230602T154843/window14/exthost/ms-vscode-remote.remote-containers/remoteContainers-2023-06-02T08-09-38.668Z.log`のようなログファイルを確認することができる。

以下で見てみよう。



# エラー詳細

ログの最後の方には以下のようなログが残っていた。

```bash
[2023-06-02T07:51:15.786Z] Writing docker-compose.devcontainer.containerFeatures-1685692275786.yml to /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/docker-compose
[2023-06-02T07:51:15.787Z] Start: Run: docker-compose --project-name test_devc -f /Users/user_name/src/test_devc/docker-compose.yml -f /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/docker-compose/docker-compose.devcontainer.build-1685692274286.yml -f /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/docker-compose/docker-compose.devcontainer.containerFeatures-1685692275786.yml up -d
[2023-06-02T07:51:15.908Z] WARN[0000] Found orphan containers ([base_container]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. 
[2023-06-02T07:51:15.929Z] [+] Running 0/0
[2023-06-02T07:51:15.929Z]  ⠋ Container base_container  Creating                                      0.0s
Error response from daemon: Conflict. The container name "/base_container" is already in use by container "fecca7d84a9a3db1bc067ca277ab248dededfed63cf4ce92ea75b79474a6fb36". You have to remove (or rename) that container to be able to reuse that name.
[2023-06-02T07:51:15.932Z] Stop (145 ms): Run: docker-compose --project-name test_devc -f /Users/user_name/src/test_devc/docker-compose.yml -f /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/docker-compose/docker-compose.devcontainer.build-1685692274286.yml -f /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/docker-compose/docker-compose.devcontainer.containerFeatures-1685692275786.yml up -d
[2023-06-02T07:51:15.933Z] Error: Command failed: docker-compose --project-name test_devc -f /Users/user_name/src/test_devc/docker-compose.yml -f /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/docker-compose/docker-compose.devcontainer.build-1685692274286.yml -f /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data/docker-compose/docker-compose.devcontainer.containerFeatures-1685692275786.yml up -d
[2023-06-02T07:51:15.933Z]     at _se (/Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js:1912:3061)
[2023-06-02T07:51:15.933Z]     at process.processTicksAndRejections (node:internal/process/task_queues:96:5)
[2023-06-02T07:51:15.933Z]     at async Bse (/Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js:1894:3170)
[2023-06-02T07:51:15.933Z]     at async Xse (/Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js:1961:2799)
[2023-06-02T07:51:15.933Z]     at async vh (/Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js:1961:3741)
[2023-06-02T07:51:15.933Z]     at async gae (/Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js:2092:10213)
[2023-06-02T07:51:15.933Z]     at async mae (/Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js:2092:9954)
[2023-06-02T07:51:15.935Z] Stop (6397 ms): Run: /Users/user_name/Downloads/Visual Studio Code.app/Contents/Frameworks/Code Helper (Plugin).app/Contents/MacOS/Code Helper (Plugin) --ms-enable-electron-run-as-node /Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js up --user-data-folder /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data --container-session-data-folder /tmp/devcontainers-d22458b3-ff1e-4b34-8584-350447dbf9761685692268456 --workspace-folder /Users/user_name/src/test_devc --workspace-mount-consistency cached --id-label devcontainer.local_folder=/Users/user_name/src/test_devc --id-label devcontainer.config_file=/Users/user_name/src/test_devc/.devcontainer/devcontainer.json --log-level debug --log-format json --config /Users/user_name/src/test_devc/.devcontainer/devcontainer.json --default-user-env-probe loginInteractiveShell --mount type=volume,source=vscode,target=/vscode,external=true --skip-post-create --update-remote-user-uid-default on --mount-workspace-git-root true
[2023-06-02T07:51:15.935Z] Exit code 1
[2023-06-02T07:51:15.936Z] Command failed: /Users/user_name/Downloads/Visual Studio Code.app/Contents/Frameworks/Code Helper (Plugin).app/Contents/MacOS/Code Helper (Plugin) --ms-enable-electron-run-as-node /Users/user_name/.vscode/extensions/ms-vscode-remote.remote-containers-0.292.0/dist/spec-node/devContainersSpecCLI.js up --user-data-folder /Users/user_name/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data --container-session-data-folder /tmp/devcontainers-d22458b3-ff1e-4b34-8584-350447dbf9761685692268456 --workspace-folder /Users/user_name/src/test_devc --workspace-mount-consistency cached --id-label devcontainer.local_folder=/Users/user_name/src/test_devc --id-label devcontainer.config_file=/Users/user_name/src/test_devc/.devcontainer/devcontainer.json --log-level debug --log-format json --config /Users/user_name/src/test_devc/.devcontainer/devcontainer.json --default-user-env-probe loginInteractiveShell --mount type=volume,source=vscode,target=/vscode,external=true --skip-post-create --update-remote-user-uid-default on --mount-workspace-git-root true
[2023-06-02T07:51:15.937Z] Exit code 1
```

最初は、上記ログのうち下から2行目が重要なエラー文言だと思っていた。そこにばかり集中して試行錯誤していたため、いつまでも手掛かりは見つからず。
しかし実際には、上から6行目が根本的な原因だった。

※下から2行目には`Command failed:`と書いてあり、一見するとここでエラーが発生したようにも読めるが、これは原因ではなく、その手前のどこかに根本的な原因が書かれているはず。そこを注意して探す。

私の場合は、このメッセージ内から根本原因を見つけることはできなかったので、次のような試行錯誤をした。[^1]


# 対応策

今回は、`devcontainer.json`から`docker-compose.yml`を呼び出していたので、試しに

- devcontainerを使わずに直接`docker-compose.yml`を呼び出し

たところ、以下のように簡易なエラーメッセージが出力され、原因がすぐにわかった。

```bash
% docker-compose up                                     
WARN[0000] Found orphan containers ([base_container]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. 
[+] Running 0/0
 ⠋ Container base_container  Creating                                                           0.0s
Error response from daemon: Conflict. The container name "/base_container" is already in use by container "fecca7d84a9a3db1bc067ca277ab248dededfed63cf4ce92ea75b79474a6fb36". You have to remove (or rename) that container to be able to reuse that name.
```

上記のメッセージを読むと`container`の名前が被っていることが原因と書かれている。
そこで、`docker-compose.yml`の`container_name`を変更したところ、当初のエラーも含めて全て解消した。


# 結論

結局、devcontainerはエラーとは関係なかった。
単に、devcontainerのせいでエラーが読みにくくなっていただけだった。

devcontainer抜きでコンテナを立ち上げてみるのも手の一つかもしれない。


# 参考

参考にはならなかったけれども、以下のGitHub issueと同様のエラーが発生していた。

https://github.com/microsoft/vscode-remote-release/issues/7488

この人のエラーは結局解消していない。

[^1]: 実際には、最初の長いエラーメッセージよく読めば、根本原因も記載されている。しかし、長すぎて、自分にはどこが重要なのかわからなかった。