Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

【Dockerのエラー】docker compose.ymlの「services」やdevcontainer.jsonの「service」では、アンダースコア(バー)「_」を使ってはいけない

Dockerのエラーの原因は、docker compose.ymlの「services」やdevcontainer.jsonの「service」に、アンダースコア(バー)「_」を使っていること?

はい、記事タイトルの通りなのですが、昨日MacBookProでVSCodeとDockerを連携させて新しくPythonフレームワークのDjango用コンテナを作っていたところ、何をしても意味不明なエラーが出てきて4時間近く無駄にしてしまいました。

エラーの内容

今回VS Code上のターミナルで出現したエラーは次の通りです。

[5455 ms] Exit code 1
[5458 ms] Command failed: /Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Plugin).app/Contents/MacOS/Code Helper (Plugin) –ms-enable-electron-run-as-node /Users/xxxx/.vscode/extensions/ms-vscode-remote.remote-containers-0.315.1/dist/spec-node/devContainersSpecCLI.js up –user-data-folder /Users/xxxx/Library/Application Support/Code/User/globalStorage/ms-vscode-remote.remote-containers/data –container-session-data-folder /tmp/devcontainers-d28c093a-e5ae-453a-864f-bac492ebd0c71696677936683 –workspace-folder /Users/xxxx/MyProjects/Test_Django_on_XserverVPS –workspace-mount-consistency cached –id-label devcontainer.local_folder=/Users/xxxx/MyProjects/Test_Django_on_XserverVPS –id-label devcontainer.config_file=/Users/xxxx/MyProjects/Test_Django_on_XserverVPS/.devcontainer/docker/devcontainer.json –log-level debug –log-format json –config /Users/xxxx/MyProjects/Test_Django_on_XserverVPS/.devcontainer/docker/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
[5459 ms] Exit code 1

まともに読む気も失せるメッセージなので無視して、いろいろ設定をいじっていました。一体何が悪いのかさっぱりわかっていませんでした。

原因

上述のようにこのエラーはハマりこみ、Dockerfileを最小構成で書き直してみたり、docker-comose.ymlやdevcontainer.jsonの各種パスの記載をいじってみたりなど、何度も何度も同じようなことを繰り返しそれでもエラーは治らず。8時間近く無駄にしました。

他のコンテナを作ったときに成功しているプロジェクトで使っているdocker-compose.ymlやdevcontainer.jsonと比較・検討したりもしましたが、さっぱり原因がわかりませんでした。

しかし、4時間近く悪戦苦闘していると、上手くいっているコンテナづくりの場合と今回の場合とで決定的に異なる点にふと気づきました。

それは、docker-compose.ymlのservices項目、そしてdevcontainer.jsonのservice項目に設定ているサービス名でした。

今回作ろうとしてエラーが出たのは、docker-compose.ymlのservices項目について、

version: '3'

services:
  django_app:
    build: .

そしてdevcontainer.jsonのservice項目について、

{
  //VSCodeに表示される開発コンテナ名
  "name":"Django_container",
  "dockerComposeFile":"docker-compose.yml",
  "service":"django_app",

このように、サービス名にアンダースコア(またはアンダーバー)をつけた名前を設定していました。

しかし、これまでコンテナ作成に成功していたプロジェクトについてはそれらの項目はすべて、webとかdjangoとか単純なものでアンダースコアは使っていませんでした。

解決方法

というわけで解決方法ですが、

  • docker-compose.ymlのservices項目
  • devcontainer.jsonのservice項目

におけるコンテナのサービス名に、アンダースコアをつかわない名前をつける(ハイフンは大丈夫です)、ということです。

なぜDockerのサービス名にアンダースコアを使ってはいけないのか?

ではなぜこのようにアンダースコアを使うとエラーになってしまうのか?それは次の2つのサイトの記事を参考にしてください。

Dockerの使い方を動画で解説してくれているUdemyの人気講座としては次のようなものがあります。

愛を分かち合いましょう