【发布时间】:2022-01-25 19:56:36
【问题描述】:
我正在尝试制作一个使用 MySQL 映像作为其基础的映像,并且一旦我知道服务器已启动,我想创建一个数据库(和其他一些东西)。我有一个引导脚本作为我的入口点,我要做的第一件事是在后台运行 mysql 映像的入口点脚本作为./entrypoint.sh mysqld &。
目前,在此之后我要做的是启动一个带有一些睡眠的循环,该循环使用mysqladmin --ping 检查服务器是否已启动。一旦启动,我将启动其他命令并开始创建我想要的数据库。
当 mysql 已经初始化(即不是第一次启动容器/entrypoint.sh 执行)时,这可以正常工作。但在第一次运行时,图像似乎创建了一个临时 mysql 服务器(mysqld --daemonize --skip-networking --default-time-zone=SYSTEM --socket="${SOCKET}" - 来自入口点脚本),运行一些命令然后停止该服务器。发布它启动实际的服务器。我面临的问题是 mysqladmin ping 命令实际上对临时服务器本身做出了成功的反应,因此我的脚本尝试创建失败的数据库。
我在这里阅读了很多答案,说运行 ping 命令(我正在使用)来检查服务器是否已启动,但我没有看到任何关于这个临时服务器或如何检测它是否是临时服务器的内容一个。
关于我如何检测到这一点的任何线索?或者如果我可以在上面提到的流程的任何部分做任何更好的事情?
我现在确实有一个 hacky 解决方案。一个涉及更新入口点脚本以使用与临时服务器的默认套接字文件不同的文件,然后我可以使用它来查看正在运行的服务器是否是临时的,但如果存在标准解决方案,我宁愿不诉诸于此。
谢谢!
【问题讨论】:
-
通常 Docker 容器是单个进程的包装器。您通常不会尝试修改
mysqld进程来运行应用程序的迁移;同样,我建议运行未修改的mysql容器,并从单独的容器运行迁移。您可能会发现等待另一个容器侦听 TCP 连接比重写mysql已经涉及的启动序列更容易。 -
对。修改启动脚本的解决方案在某种意义上是我最后的手段。但你是对的,我可以监听 TCP 连接。我没有意识到
--skip-networking禁用了 TCP。还有多个容器,我想以某种方式将它用作我的“开发”容器,这就是为什么我试图只使用一个容器来保持简单。
标签: mysql docker shell docker-compose mariadb