一尘不染

运行Docker容器时如何自动启动服务?

docker

我有一个Dockerfile将MySQL服务器安装在一个容器中,然后我开始像这样:

sudo docker run -t -i 09d18b9a12be /bin/bash

但是MySQL服务不会自动启动,我必须手动运行(从容器内部):

service mysql start

运行docker容器时如何自动启动MySQL服务?


阅读 2123

收藏
2020-06-17

共1个答案

一尘不染

首先,有一个 问题, 在您的Dockerfile

RUN service mysql restart && /tmp/setup.sh

Docker映像不会保存正在运行的进程。因此,您的RUN命令仅在docker build阶段执行,并在构建完成后停止。相反,您需要使用CMDENTRYPOINT如下所示的命令在启动容器时指定命令:

CMD mysql start

其次,docker容器需要一个进程(最后一个命令)来保持运行,否则该容器将退出/停止。因此,普通service mysql start命令不能直接在Dockerfile中使用。

保持进程运行的典型方法有三种:

  • 使用service命令并在其后附加非结束命令tail -F
    CMD service mysql start && tail -F /var/log/mysql/error.log
    

当您运行单个服务时,这通常是首选的,因为这会使输出的日志可供docker访问。

  • 或使用前台命令执行此操作
    CMD /usr/bin/mysqld_safe
    

仅当存在类似的脚本时,此方法才有效mysqld_safe

  • 或将您的脚本打包start.sh并放在最后
    CMD /start.sh
    

如果命令必须执行一系列步骤(最好再次/start.sh保持运行状态),则最好。

注意

对于初学者supervisord,不建议使用。老实说,这太过分了。最好对容器使用单个服务/单个命令。

顺便说一句:请检查https://registry.hub.docker.com以获取现有的mysql
docker镜像以供参考

2020-06-17