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

新手上路,请多包涵

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

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

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

 service mysql start

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

原文由 mtmacdonald 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 775
2 个回答

首先,您的 Dockerfile问题

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

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

 CMD mysql start

其次,docker容器需要一个进程(last command)来保持运行,否则容器会退出/停止。所以在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 并将其放在最后
  CMD /start.sh

如果命令必须执行一系列步骤,这是最好的,同样, /start.sh 应该保持运行。

笔记

对于初学者使用 supervisord 不推荐。老实说,这是矫枉过正。对容器使用单个服务/单个命令要好得多。

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

原文由 Larry Cai 发布,翻译遵循 CC BY-SA 3.0 许可协议

在您的 Dockerfile 中,在最后一行添加

ENTRYPOINT service ssh restart && bash

这个对我有用

这是结果:

 root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu
 * Restarting OpenBSD Secure Shell server sshd   [ OK ]
root@dccc354e422e:~# service ssh status
 * sshd is running

原文由 Jia 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进