Я докерствую свое существующее 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
не будет полностью запущен и готов к приему соединений?