Docker: сценарий "wait-for-it" не запускает приложение, когда MySQL готов - PullRequest
1 голос
/ 25 мая 2020

Я использую Docker -Compose и wait-for-it , чтобы запустить свой бэкэнд с Node.js, как только служба MySQL будет готова принимать соединения. Моя проблема в том, что сценарий не понимает, что соединение готово само по себе. Я могу заставить его работать, если я установлю тайм-аут на 20 секунд, так как к тому времени будет работать MySQL, но это может измениться в разных средах, и приложение вылетит sh, если для определенной среды c потребуется больше времени. Я хочу, чтобы он периодически проверял это, поскольку считаю, что это правильно.

Это мой docker -compose.yml:

version: "3.8"

services:

  app:
    image: pfmc
    ports:
      - 4005:4005
    working_dir: /usr/src/app
    command: sh -c './wait-for-it.sh -t 0 db:3306 -- npm start'
    environment: 
      MYSQL_ROOT_PASSWORD: pfmc123
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: pfmc123
      MYSQL_DATABASE: pfmc

  mysql:
    image: mysql:5
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    volumes:
      - ./db-startup:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: pfmc123
      MYSQL_DATABASE: pfmc

Журналы:

app_1    | wait-for-it.sh: waiting for db:3306 without a timeout
mysql_1  | 2020-05-25 19:59:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.30-1debian10 started.
mysql_1  | 2020-05-25 19:59:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql_1  | 2020-05-25 19:59:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.30-1debian10 started.
mysql_1  | 2020-05-25 19:59:58+00:00 [Note] [Entrypoint]: Initializing database files

и остается на этом месте:

mysql_1  | 2020-05-25T20:00:08.243448Z 0 [Note] mysqld: ready for connections.
mysql_1  | Version: '5.7.30'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

Большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 25 мая 2020

У вас есть одна проблема: ваш контейнер MySQL - это служба с именем mysql, а не db, вам следует либо адаптировать службу, чтобы она называлась db, либо вызов wait-for-it для опроса в соединении to mysql:3306

Все вместе ваш docker -compose.yml должен выглядеть так - я добавил исправление с комментарием @fixme:

version: "3.8"

services:

  app:
    image: pfmc
    ports:
      - 4005:4005
    working_dir: /usr/src/app
    command: sh -c './wait-for-it.sh -t 0 db:3306 -- npm start'
    environment: 
      MYSQL_ROOT_PASSWORD: pfmc123
      # A first @fixme is here 
      MYSQL_HOST: db
      MYSQL_USER: root
      MYSQL_PASSWORD: pfmc123
      MYSQL_DATABASE: pfmc

  # And a second @fixme is here
  db: 
    image: mysql:5
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    volumes:
      - ./db-startup:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: pfmc123
      MYSQL_DATABASE: pfmc
...