У меня есть сценарий bash:
#!/bin/bash
docker-compose up -d
# wait for the database to come up
until mysqlshow --user=root -h localhost -P 3306 --protocol=tcp > /dev/null 2>&1; do
echo "Waiting for mysql container..."
sleep 0.5
done
RESULT='mysqlshow --user=root -h localhost -P 3306 --protocol=tcp payments| grep -o payments'
if ! [[ $RESULT = *"payments"* ]]; then
./node_modules/.bin/sequelize db:create
fi
./node_modules/.bin/sequelize db:migrate
yarn start
Вышеизложенное работает, но для этого требуется, чтобы mysql
устанавливался локально, какой тип поражения использует докер.
Есть ли способ лучше:
Нет никакого позора в том, что на вашем хосте установлены инструменты. Они имеют преимущество использования локальной локальной файловой системы без лишних трюков с переназначением и не требуют запуска привилегий root. Ваш сценарий в порядке; он не побеждает цели Докера вообще.
Один подход "больше Dockery", который вы можете предпринять, особенно если вы всегда хотите запустить миграцию, состоит в том, чтобы переместить последнюю половину этого в сценарий ENTRYPOINT в вашем контейнере приложения. Я могу написать скрипт вроде:
#!/bin/sh
if [ -n "$MYSQL_HOST" -a -z "$SKIP_DB_SETUP" ]; then
# TODO: write Node code that waits until a database connection succeeds
./node_modules/.bin/sequelize db:create || true
./node_modules/.bin/sequelize db:migrate
fi
exec "$@"
и используйте это как ENTRYPOINT моего изображения.