第一次运行时Docker脚本未连接(sql转储)

第一次运行时Docker脚本未连接(sql转储),docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我试图通过docker和脚本运行mysql。一切正常,它运行,它创建用户和数据库。我可以使用workbench连接到它,但它不运行dump.sql 我得到以下错误 用户“userxx”@“localhost”的访问被拒绝(使用密码:是) 但若我再次运行脚本,它将连接并运行dump.sql 这是我的剧本: #!/bin/sh echo "Starting DB..." docker run --name test_db -d \ -e MYSQL_ROOT_PASSWORD=test2018

我试图通过docker和脚本运行mysql。一切正常,它运行,它创建用户和数据库。我可以使用workbench连接到它,但它不运行
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
#/垃圾箱/垃圾箱
回显“启动数据库…”
docker运行--名称测试\u db-d\
-e MYSQL\u ROOT\u PASSWORD=test2018\
-e MYSQL\u数据库=test-e MYSQL\u用户=test\u用户-e MYSQL\u密码=test2018\
-3306:3306\
mysql:最新版本
#等待数据库服务启动。
echo“等待数据库启动…”
docker exec test_db mysqladmin--silent--wait=30-utest_user-ptest2018 ping | |退出1
#运行安装脚本。
echo“设置初始数据…”
docker exec-i test_db mysql-utest_user-ptest2018 test

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

与其执行转储,不如在run命令中将sql文件装载到init目录:
/docker entrypoint initdb.d

只需添加开关:

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

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

如果运行
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就绪时,运行状况将
正常

因此,请按如下所示修改脚本

#!/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
等到它恢复健康

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


在Dockerfile中,您可以使用命令
运行
,并在那里转储数据或执行任何您想要的操作,因此是的,这是一个shell脚本,而不是Dockerfile。
docker inspect test_db --format '{{.State.Health.Status}}'