我看过很多教程似乎都在做我想做的事情,但是由于某种原因,我的Docker容器退出了。基本上,我正在Docker容器内设置一个Web服务器和一些守护程序。我通过bash脚本(run- all.sh
在Dockerfile中通过CMD运行)完成了最后部分。run-all.sh
看起来像这样:
service supervisor start
service nginx start
然后在Dockerfile中启动它,如下所示:
CMD ["sh", "/root/credentialize_and_run.sh"]
我可以看到,当我手动运行事物时(即使用-i -t / bin /
bash进入映像),所有服务都可以正确启动,并且在运行映像时一切看起来都可以正常运行,但是一旦退出它完成了我的流程的启动。我希望这些进程可以无限期地运行,据我所知,容器必须继续运行才能实现这一点。不过,当我跑步时docker ps -a
,我看到:
➜ docker_test docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7706edc4189 some_name/some_repo:blah "sh /root/run-all.sh 8 minutes ago Exited (0) 8 minutes ago grave_jones
是什么赋予了?为什么退出?我知道我可以在bash脚本的末尾放置一个while循环来保持它,但是什么是防止它退出的正确方法呢?
这并不是设计Docker容器的真正方法。
在设计Docker容器时,应该将其构建为仅运行 一个
进程(即,您应该为Nginx提供一个容器,为管理者或正在运行的应用提供一个容器);此外,该过程应在前台运行。
当进程本身退出时,容器将“退出”(在您的情况下,该进程就是您的bash脚本)。
但是,如果您 确实 需要(或想要)在Docker容器中运行多个服务,请考虑从“ Docker Base
Image”开始
,该镜像runit
用作伪初始化进程(runit
在运行Nginx和Supervisor时将保持在线状态)在前台,而其他流程则在做他们的事情。
他们有大量的文档,因此您应该能够轻松轻松地实现您想做的事情。
我见过一堆教程,它们似乎做了与我想做的相同的事情,但由于某种原因,我的Docker容器退出了。基本上,我在Docker容器中设置了一个Web服务器和几个守护进程。我通过一个名为的bash脚本来完成这一过程的最后部分,该脚本通过DockerFile中的CMD运行。如下所示: 我在Dockerfile中启动它,如下所示: 我可以看到,当我手动运行事情时(即使用-i-t/bin/bash进入映像),所有
我有一个Dockerfile来在容器中安装MySQL server,然后我这样开始: 但MySQL服务不会自动启动,我必须手动运行(从容器内): 如何在运行docker容器时自动启动MySQL服务?
问题内容: 我有一个Dockerfile将MySQL服务器安装在一个容器中,然后我开始像这样: 但是MySQL服务不会自动启动,我必须手动运行(从容器内部): 运行docker容器时如何自动启动MySQL服务? 问题答案: 首先,有一个 问题, 在您的: Docker映像不会保存正在运行的进程。因此,您的命令仅在阶段执行,并在构建完成后停止。相反,您需要使用或如下所示的命令在启动容器时指定命令:
问题内容: 我正在使用Search Guard插件来保护由多个节点组成的elasticsearch集群。这是我的Dockerfile: 初始化SearchGuard(创建内部用户并分配角色)。容器启动后,我需要运行脚本。这是问题所在:除非运行Elasticsearch,否则脚本将不会初始化任何安全性索引。 脚本的内容是: 现在,我只是在容器启动后手动运行脚本,但是由于我是在Kubernetes上运
问题内容: 我正在使用redis在nodejs应用程序中提供会话支持。我已经安装了redis服务器,当我运行redis- server时,它可以工作,但是当我关闭终端redis时,它停止工作,并且不起作用。关闭终端后如何保持Redis服务器运行? 问题答案: 将Redis作为守护程序启动的最简单方法是编辑配置文件并更改以下行: 启动配置文件时,请确保在redis-server命令行上提供该配置文件