我有一个 Dockerfile在容器中安装 MySQL 服务器,然后我开始这样:
sudo docker run -t -i 09d18b9a12be /bin/bash
但是 MySQL 服务不会自动启动,我必须手动运行(从容器内):
service mysql start
如何在运行 docker 容器时自动启动 MySQL 服务?
最佳答案
首先,您的 Dockerfile
中有一个问题:
RUN service mysql restart && /tmp/setup.sh
Docker 镜像不保存正在运行的进程。因此,您的 RUN
命令仅在 docker build
阶段执行,并在构建完成后停止。相反,您需要在容器启动时使用 CMD
或 ENTRYPOINT
命令指定命令,如下所示:
CMD mysql start
其次,docker容器需要一个进程(最后一个命令)来保持运行,否则容器将退出/停止。所以不能直接在Dockerfile中使用普通的service mysql start
命令。
解决方案
保持进程运行的典型方法有以下三种:
使用
service
命令并在其后附加非结束命令,如tail -F
CMD service mysql start && tail -F /var/log/mysql/error.log
当您运行单个服务时,这通常是首选,因为它使输出的日志可供 docker 访问。
或者使用前台命令来做到这一点
CMD /usr/bin/mysqld_safe
这只有在有像 mysqld_safe
这样的脚本时才有效。
或者将你的脚本包装到
start.sh
并把它放在 endCMD /start.sh
如果命令必须执行一系列步骤,这是最好的,同样,/start.sh
应该保持运行。
注意
不建议初学者使用supervisord
。老实说,这是矫枉过正。对容器使用单个服务/单个命令要好得多。
顺便说一句:请查看 https://registry.hub.docker.com现有的mysql docker镜像供引用
关于docker - 运行docker容器时如何自动启动服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25135897/