【发布时间】:2021-12-31 18:21:55
【问题描述】:
我们刚刚开始将我们的应用程序迁移到容器中,所以我对容器世界非常陌生。 在我们的容器镜像中,我们只有安装了一些 rpm 和一些脚本复制到容器的基本 linux 镜像。我们当时认为我们不会在图像本身中有任何命令/入口点。当容器启动时,我们的部署作业将在容器内运行一个脚本来启动服务(jetty/hbase/..)。即容器启动和服务启动是部署作业中的两个不同步骤。 这一直有效,直到我使用 docker run/podman run 命令启动容器。 现在,我们考虑转向 docker-compose 方式。但是,当我说“docker-compose up”时,它会抱怨“错误:没有在命令行上指定命令或在此图像中指定为 CMD 或 ENTRYPOINT”。即在使用 run 命令启动容器时,没有任何 CMD 或 ENTRYPOINT 是可以的,但是在使用 docker-compose 启动容器时,必须提供一个,为什么会这样?
为了克服该错误,我们尝试将一些简单的 CMD 放入 compose 文件中,例如 /bin/bash。但是,使用这种方法,容器会立即退出。我发现许多 stackoverflow 链接解释了为什么会发生这种情况,例如:Why docker container exits immediately。如果我将 CMD 作为 tail -f /dev/null 放在撰写文件中,那么容器就会保持不变。
请您帮助澄清什么是正确的做法。如前所述,我们的要求是我们要在没有任何服务的情况下启动容器,然后单独启动服务。因此,我们没有 CMD/ENTRYPOINT 的任何用例。
【问题讨论】:
-
为什么要把容器的启动和包含的服务的启动分开呢?这听起来像XY problem。
-
您可能想查看初始化系统和解决方法,例如哑初始化 github.com/Yelp/dumb-init 。我认为没有默认的初始化系统,因此轻量级容器可以成为一个东西,但我不太确定
-
另外,通常你不需要在容器中运行命令之前“启动”容器,因为在它空闲时你没有任何东西可以运行。
-
一个容器运行一个进程; Dockerfile
CMD说明了它是什么。您通常不会在容器中“启动服务”。容器要运行的单个进程是什么?您是否需要多个容器来运行您的每个组件(这将是一个非常正常的设置)? -
感谢您到目前为止的回答。我们的应用程序本质上包含 Jetty 和 Hbase。我们计划在同一个容器中运行它们。您能否澄清一下这种行为:当我像这样运行图像时: docker run -d
bash --> 我的图像没有任何 CMD 或 ENTRYPOINT,因此“bash”成为此处的 cmd。在这种情况下,我的容器会出现并保持不变。但是,如果我将相同的内容放入 compose 文件 CMD: ["bash"] 并说 docker-compose up,那么容器会立即退出。我的问题是如何确保容器在使用 docker-compose 时保持运行。
标签: docker docker-compose podman