0

我有这个 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在本地安装,这违背了使用 docker 的目的。

有没有更好的办法:

  1. 我可以在不使用 mysql 的情况下检查数据库是否已启动。
  2. 如果它不存在,我可以在开始创建数据库时在容器中运行创建脚本。
4

1 回答 1

0

在您的主机上安装工具并不可耻。这些具有使用本地本地文件系统的优势,无需奇怪的重新映射技巧,并且不需要 root 权限即可运行。你的脚本很好;它根本没有违背 Docker 的目的。

您可以采取的一种“更多 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 "$@"

并将其用作我的图像的入口点。

于 2018-09-18T10:02:35.187 回答