第一次运行时Docker脚本没有连接(sql dump)

时间:2018-02-24 17:09:53

标签: docker docker-compose dockerfile

我试图通过docker和脚本运行mysql。一切正常,它运行它创建用户和数据库。我可以使用工作台连接到它,但它不会运行dump.sql

我收到以下错误

  

用户访问被拒绝' userxx' @' localhost' (使用密码:是)

但如果我再次运行脚本,它将连接并运行dump.sql

这是我的剧本:

#!/bin/sh

echo "Starting DB..."
docker run --name test_db -d \
  -e MYSQL_ROOT_PASSWORD=test2018 \
  -e MYSQL_DATABASE=test -e MYSQL_USER=test_user -e MYSQL_PASSWORD=test2018 \
  -p 3306:3306 \
  mysql:latest

# Wait for the database service to start up.
echo "Waiting for DB to start up..."
docker exec test_db mysqladmin --silent --wait=30 -utest_user -ptest2018 ping || exit 1

# Run the setup script.
echo "Setting up initial data..."
docker exec -i test_db mysql -utest_user -ptest2018 test < dump.sql

我做错了什么?或者有没有办法通过Dockerfile运行转储,因为我无法设法做到这一点?

2 个答案:

答案 0 :(得分:1)

不要执行转储,而是在运行命令中将sql文件更好地安装到MySQL’s image/docker-entrypoint-initdb.d的init目录中。

只需添加开关:

-v $PWD/dump.sql:/docker-entrypoint-initdb.d/dump.sql

专业提示:)不要使用最新标签。始终使用稳定的特定标签,如5,5.7,8等。

答案 1 :(得分:1)

如果你运行docker run --help,你会看到这些标志

  --health-cmd string              Command to run to check health
  --health-interval duration       Time between running the check (ms|s|m|h) (default 0s)
  --health-retries int             Consecutive failures needed to report unhealthy
  --health-start-period duration   Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
  --health-timeout duration        Maximum time to allow one check to run (ms|s|m|h) (default 0s)

因此,您可以使用这些命令通过提供的命令检查运行状况。在您的情况下,该命令是

mysqladmin --silent -utest_user -ptest2018 ping

现在如下跑步

docker run --name test_db -d \
  -e MYSQL_ROOT_PASSWORD=test2018 \
  -e MYSQL_DATABASE=test -e MYSQL_USER=test_user -e MYSQL_PASSWORD=test2018 \
  -p 3306:3306 \
  --health-cmd="mysqladmin --silent -utest_user -ptest2018 ping" \
  --health-interval="10s" \
  --health-retries=6 \
  mysql:latest

如果您运行docker ps,您会看到

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                             PORTS                    NAMES
5d1d160ed7de        mysql:latest        "docker-entrypoint.s…"   16 seconds ago      Up 16 seconds (health: starting)   0.0.0.0:3306->3306/tcp   test_db

您会在状态中看到health: starting

最后你可以用它来等待。当你的mysql准备就绪时,健康状况将是healthy

所以修改你的脚本如下

#!/bin/bash

docker run --name test_db -d \
  -e MYSQL_ROOT_PASSWORD=test2018 \
  -e MYSQL_DATABASE=test -e MYSQL_USER=test_user -e MYSQL_PASSWORD=test2018 \
  -p 3306:3306 \
  --health-cmd="mysqladmin --silent -utest_user -ptest2018 ping" \
  --health-interval="10s" \
  --health-retries=6 \
  mysql:latest

# Wait for the database service to start up.
echo "Waiting for DB to start up..."
until [ $(docker inspect test_db --format '{{.State.Health.Status}}') == "healthy" ]
do
  sleep 10
done

# Run the setup script.
echo "Setting up initial data..."
docker exec -i test_db mysql -utest_user -ptest2018 test < dump.sql

此处,以下命令返回健康状况

docker inspect test_db --format '{{.State.Health.Status}}'

等到它恢复健康。

  

注意:我在脚本中使用了#!/bin/bash