从Docker容器中的脚本创建数据库时,与MySQL服务器的连接丢失

时间:2017-04-06 08:04:53

标签: mysql docker

我正在设置一个脚本来为开发人员本地计算机配置Docker环境。该脚本的一个特定部分包括创建一个具有本地卷的临时容器,以设置我将在下一步中使用的数据库。这是脚本中使用的代码:

docker run -d --name mysql_temp -v ~/dev/mysql:/var/lib/mysql/data -e MYSQL_ROOT_PASSWORD=test -p 3306:3306 centos/mysql-57-centos7:latest

脚本中的下一步是这一行:

mysql -u root -h 127.0.0.1 --protocol=tcp --password=test -e "CREATE DATABASE db_test;"

然后,脚本返回给我这个错误:

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2

奇怪的是,如果我在第一个命令之后用exit命令强制退出并且我直接在终端中执行第二个命令,它就可以工作并创建数据库。

知道发生了什么事吗?

提前感谢,

1 个答案:

答案 0 :(得分:2)

在脚本中,当第一行执行时,它会创建docker容器。但是需要时间来初始化容器上的mysql服务器。该脚本执行第二行而不等待mysql初始化。因此它无法连接。

我假设您已经编写了一个shell脚本。请尝试以下脚本。

docker run -d --name mysql_temp -v ~/dev/mysql:/var/lib/mysql/data -e MYSQL_ROOT_PASSWORD=test -p 3306:3306 centos/mysql-57-centos7:latest
sleep 10
mysql -u root -h localhost --protocol=tcp -ptest -e "CREATE DATABASE db_test;"

注意第二行有睡眠10.基本上这会在执行下一个命令之前产生10秒的延迟。如果仍然无法工作,请尝试将睡眠时间更改为更高。

同时将127.0.0.1更改为localhost,将--password = test更改为-ptest

注意:您说如果退出脚本并手动运行mysql命令,则可以正常工作。这是因为当你尝试手动运行时,容器已经初始化了mysql。尝试在一个终端窗口中运行docker run命令。容器启动后,尝试立即在另一个终端窗口中运行mysql命令,看它是否像预期的那样快速运行。