我正在设置一个脚本来为开发人员本地计算机配置 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,然后直接在终端中手动执行第二个命令,它就会工作并为我创建数据库。
知道这是怎么回事吗?
提前致谢,
小智 4
在脚本中,当第一行执行时,它会创建 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;"
Run Code Online (Sandbox Code Playgroud)
请注意第二行的 sleep 10。基本上,这将在执行下一个命令之前产生 10 秒的延迟。如果仍然不起作用,请尝试延长睡眠时间。
还将 127.0.0.1 更改为 localhost,并将 --password=test 更改为 -ptest
注意:你说如果退出脚本并手动运行mysql命令,它就可以工作。那是因为当您尝试手动运行时,容器已经初始化了 mysql。尝试在一个终端窗口中运行 docker run 命令。容器启动后,尝试立即在另一个终端窗口中运行 mysql 命令,看看它是否按预期运行。