なずなログ

ただのSIer系SEが思ったことや色々書く感じのアレです

【docker】docker-compose PHP + MySQL + Nginxでnginxが`host not found in upstream`というエラーを吐いた時の対処法

やろうとしたこと

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 を使って他のコンテナ内サービス起動を待つ