やろうとしたこと
ワイ「vscodeのRemote-ContainersとDockerでアプリ開発してみよ。まずはnginxからや。Remote-ContainersもDockerもnginxも全然知らんけどなんとかなるやろ」
起きたこと
以下のymlを用意し、docker-compose up -d
すると、localhost:8080で別に用意したindex.htmlが表示されることを確認。
version: '3.8'
services:
web:
image: nginx
volumes:
- .:/usr/share/nginx/html
ports:
- "8080:80"
が、同じものをvscodeのRemote-Containersで開いた場合、localhost:8080にアクセスしてもindex.htmlが表示されない。
Remote-Containers実行時に自動で作成される./.devcontainer/docker-compose.yml
にcommand: /bin/sh -c "while sleep 1000; do :; done"
行がデフォルトで記述されているのだが、この行があるとindex.htmlが表示されなくなる模様。
.devcontainer/ # Remote-Containers実行で自動生成
devcontainer.json
docker-compose.yml # こいつにcommand行がある
docker-compose.yml
index.html
※ command: (以下略)
が./docker-compose.yml
に書かれていた場合もindex.htmlが表示されなくなる。
なんで?
わからん...。
command: /bin/sh -c "while sleep 1000; do :; done"
無しのdocker-compose.yml
でnginxコンテナを起動し、アタッチして同じsleepコマンドを叩くとちゃんと実行される(以下ログ)ので、コンテナ内でcommand:
のコマンドでエラーが出ているわけではなさそう。
root@hoge:/workspace# /bin/sh -c "while sleep 1000; do :; done"
^C
root@hoge:/workspace#
なんか怪しいやついた
docker ps --no-trunc
をやってみたところ、手動でdocker-compose up -d
やった時のCOMMAND
は/docker-entrypoint.sh nginx -g 'daemon off;'
とのこと。これが/bin/sh -c "while sleep 1000; do :; done"
によって上書きされるからか?
web_tmp > docker-compose up -d
Creating web_tmp_web_1 ... done
web_tmp >
web_tmp > docker ps --no-trunc
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS NAMES
8f7c7a3300bd7e9894f387b39cc904776858893e337f849ecee5dd69e6ad9291 nginx "/docker-entrypoint.sh nginx -g 'daemon off;'"
2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp web_tmp_web_1
web_tmp >
ビンゴ
docker-compose.yml
でcommand: /docker-entrypoint.sh nginx -g 'daemon off;'
にしたらindex.html
が表示された。原因これだ!
デフォルトで暗黙的に実行されているdocker-entrypoint.sh
を別コマンドで上書きしてしまった結果、nginxのdaemonが起動しなくなったものと思われる。ひとまず解決した!やったー!!
まとめ
- 事象 : nginxの
docker-compose.yml
にcommand: /bin/sh -c "while sleep 1000; do :; done"
があるとindex.htmlが表示されなくなる - 原因 : nginxコンテナを起動する時の
COMMAND
が、デフォルト(=/docker-entrypoint.sh nginx -g 'daemon off;'
)から/bin/sh -c "while sleep 1000; do :; done"
に上書きされてしまうため - 対処 : すべての
docker-compose.yml
からcommand:
をコメントアウトする。(あるいは、command: /docker-entrypoint.sh nginx -g 'daemon off;'
にする。普通そんなことしないけど。)