やろうとしたこと
docker-compose.yml
version: '2' services: web: image: nginx ports: - 8080:80 volumes: - ./src:/src - ./web/default.conf:/etc/nginx/conf.d/default.conf app: depends_on: - db build: ./app volumes: - ./src:/src environment: MYSQL_USER: homestead MYSQL_PASSWORD: secret db: image: mysql:5.7 restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: october MYSQL_USER: homestead MYSQL_PASSWORD: secret ports: - 13306:3306 volumes: - ./db/mysql_init:/docker-entrypoint-initdb.d - ./db/mysql_data:/var/lib/mysql command: --innodb-use-native-aio=0
事象
Nginxがhost not found in upstream app
というエラーを吐いてうまく起動しないで終了してしまう。
原因
appにdepends_on: db
が存在するから。
depends_on
でappが起動待機中にnginxが起動するからエラーになる。
(要するに起動順序の指定が甘かった)
なお、depends_on
はあくまで起動順序のみを見てくれるやつで、ちゃんと立ち上がったかどうかまでは確認してくれない。
解決方法
暫定対処
depends_onを消す(起動順は気にせずに、たぶん起動するだろう論)
本格対処
dockerizeを使用してコンテナの起動確認をしてからentrypointを叩くようにする。 dockerizeは以下の記事が詳しい。 dockerize を使って他のコンテナ内サービス起動を待つ