当前位置: 首页 > 面试题库 >

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

秋和雅
2023-03-14
问题内容

我有一个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容器需要一个进程(最后一个命令)来保持运行,否则该容器将退出/停止。因此,普通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镜像以供参考



 类似资料:
  • 我有一个Dockerfile来在容器中安装MySQL server,然后我这样开始: 但MySQL服务不会自动启动,我必须手动运行(从容器内): 如何在运行docker容器时自动启动MySQL服务?

  • 问题内容: 我正在使用Search Guard插件来保护由多个节点组成的elasticsearch集群。这是我的Dockerfile: 初始化SearchGuard(创建内部用户并分配角色)。容器启动后,我需要运行脚本。这是问题所在:除非运行Elasticsearch,否则脚本将不会初始化任何安全性索引。 脚本的内容是: 现在,我只是在容器启动后手动运行脚本,但是由于我是在Kubernetes上运

  • 问题内容: 我看过很多教程似乎都在做我想做的事情,但是由于某种原因,我的Docker容器退出了。基本上,我正在Docker容器内设置一个Web服务器和一些守护程序。我通过bash脚本(在Dockerfile中通过CMD运行)完成了最后部分。看起来像这样: 然后在Dockerfile中启动它,如下所示: 我可以看到,当我手动运行事物时(即使用-i -t / bin / bash进入映像),所有服务都

  • 问题内容: 假设我有一个要运行的Docker容器,那么我可以调用 一切都很好。如果系统崩溃并重新启动,是否有内置的方式来运行容器,使其能够自动重新启动? 如果是这样,这在Docker Compose中也可用吗? 问题答案: 是的,docker具有重启策略,该策略可以处理此问题。这也可以在compose.yml配置文件中找到。

  • 假设我有一个要运行的Docker容器,然后我可以调用 一切都很好。是否有一种内置方法可以运行容器,以便在系统崩溃并重新启动时自动重新启动容器? 如果是这样,这在 Docker Compose 中是否也可用?

  • 我见过一堆教程,它们似乎做了与我想做的相同的事情,但由于某种原因,我的Docker容器退出了。基本上,我在Docker容器中设置了一个Web服务器和几个守护进程。我通过一个名为的bash脚本来完成这一过程的最后部分,该脚本通过DockerFile中的CMD运行。如下所示: 我在Dockerfile中启动它,如下所示: 我可以看到,当我手动运行事情时(即使用-i-t/bin/bash进入映像),所有