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

标签 docker

我有一个 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 阶段执行,并在构建完成后停止。相反,您需要在容器启动时使用 CMDENTRYPOINT 命令指定命令,如下所示:

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 并把它放在 end

    CMD /start.sh
    

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

注意

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

顺便说一句:请查看 https://registry.hub.docker.com现有的mysql docker镜像供引用

关于docker - 运行docker容器时如何自动启动服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25135897/

相关文章:

bash - 提供空列表时,是否有标志使 docker 静音

docker - containerd-shim 如何创建无守护进程的容器?

docker - 如何暴露 docker 容器端口并从 postman 调用?

Apache docker 容器 - .htaccess 重写规则 404

ruby-on-rails - rails,when 和 docker - cron 任务不运行

android - Android开发Dockerfile:为什么Android SDK Manager挂起?

ruby-on-rails - 在heroku上运行时的ssh-agent问题

docker - 如何在 Web 应用程序中使用\连接到 sonatype nexus docker registry v2 api?

docker - 将堆栈部署到远程集群

docker - 在开发过程中使用docker运行前端构建过程不是一个好主意吗?