LoginSignup
2
2

More than 3 years have passed since last update.

vscodeのRemote-Containersでnginxを使おうとした時に困ったメモ

Last updated at Posted at 2020-10-09

やろうとしたこと

ワイ「vscodeのRemote-ContainersDockerでアプリ開発してみよ。まずはnginxからや。Remote-ContainersもDockerもnginxも全然知らんけどなんとかなるやろ」

起きたこと

以下のymlを用意し、docker-compose up -dすると、localhost:8080で別に用意したindex.htmlが表示されることを確認。

docker-compose.yml
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.ymlcommand: /bin/sh -c "while sleep 1000; do :; done"行がデフォルトで記述されているのだが、この行があるとindex.htmlが表示されなくなる模様。

Remote-Containers実行後のディレクトリ構造
.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.ymlcommand: /docker-entrypoint.sh nginx -g 'daemon off;'にしたらindex.htmlが表示された。原因これだ!

デフォルトで暗黙的に実行されているdocker-entrypoint.shを別コマンドで上書きしてしまった結果、nginxのdaemonが起動しなくなったものと思われる。ひとまず解決した!やったー!!

まとめ

  • 事象 : nginxのdocker-compose.ymlcommand: /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;'にする。普通そんなことしないけど。)

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2