在Docker容器中通过脚本创build数据库时,与MySQL服务器失去连接

我正在设置一个脚本来为开发者本地机器configurationDocker环境。 脚本的一个特定部分包括创build一个临时容器与本地卷来设置我将在下一步使用的数据库。 这是脚本中使用的代码:

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命令后,第一个命令,我执行第二个手,直接在terminal,它的工作,并创build我的数据库。

不知道这是怎么回事?

提前致谢,

在你的脚本中,当第一行执行时,它会创builddocker容器。 但是在容器上初始化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.基本上这会在执行下一个命令之前创build10秒的延迟。 尝试改变睡眠时间,如果它仍然不起作用。

还要将127.0.0.1更改为localhost,并将–password = test更改为-ptest

注意:你说如果你退出脚本并手动运行mysql命令,它就会起作用。 那是因为当你尝试手动运行的时候,容器已经初始化了mysql。 尝试在一个terminal窗口中运行docker run命令。 一旦容器启动,请尝试在另一个terminal窗口中立即运行mysql命令,以查看它是否按预期的那样快速运行。