Docker подождите, пока сервис не будет полностью готов - PullRequest
2 голосов
/ 30 января 2020

Я докерствую свое существующее Django приложение.

У меня есть скрипт entrypoint.sh, который запускается как точка входа Dockerfile

ENTRYPOINT ["/app/scripts/docker/entrypoint.sh"]

Это содержимое содержит скрипт для запуска миграции, когда переменная среды настроена на миграцию

#!/bin/sh
#set -e

# Run the command and exit with the custom message when the comamnd fails to run
safeRunCommand() {
  cmnd="$*"
  echo cmnd="$cmnd"
  eval "$cmnd"
  ret_code=$?
  if [ $ret_code != 0 ]; then
    printf "Error : [code: %d] when executing command: '$cmnd'\n" $ret_code
    exit $ret_code
  else
    echo "Command run successfully: $cmnd"
  fi
}

runDjangoMigrate() {
  echo "Migrating database"
  cmnd="python manage.py migrate --noinput"
  safeRunCommand "$cmnd"
  echo "Done: Migrating database"
}

# Run Django migrate command.
# The command is run only when environment variable `DJANGO_MANAGE_MIGRATE` is set to `on`.
if [ "x$DJANGO_MANAGE_MIGRATE" = 'xon' ] && [ ! "x$DEPLOYMENT_MODE" = 'xproduction' ]; then
  runDjangoMigrate
fi

# Accept other commands
exec "$@"

Теперь в файле docker-compose есть такие службы, как

version: '3.7'

services:
  database:
    image: mysql:5.7
    container_name: 'qcg7_db_mysql'
    restart: always

  web:
    build: .
    command: ["./wait_for_it.sh", "database:3306", "--", "./docker_start.sh"]
    volumes:
      - ./src:/app
    depends_on:
      - database
    environment:
      DJANGO_MANAGE_MIGRATE: 'on'

Но когда я создаю образ, используя

docker-compose up --build

Не удается запустить команду миграции из сценария точки входа с ошибкой

(2002, "Can't connect to MySQL server on 'database' (115)")

Это связано с тем, что сервер базы данных не имеет все еще запущен.

Как сделать так, чтобы сервис web ожидал, пока сервис database не будет полностью запущен и готов к приему соединений?

1 Ответ

0 голосов
/ 30 января 2020

К сожалению, в Docker нет собственного способа дождаться готовности службы базы данных, прежде чем веб-приложение Django попытается подключиться. Depends_on будет гарантировать, что веб-приложение будет запущено после запуска контейнера базы данных.

Из-за этого ограничения вам нужно будет решить эту проблему в том, как работает ваш контейнер. Самое простое решение - изменить точку входа. sh на 10-30 секунд, чтобы ваша база данных имела время для инициализации перед выполнением каких-либо дополнительных команд. Эта официальная MySQL точка входа. sh показывает пример блокировки до готовности базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...