やろうとしたこと
ワイ「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;'にする。普通そんなことしないけど。)