使用单个CMD在Dockerfile上定义多个服务

时间:2018-05-23 06:14:25

标签: docker dockerfile

说我有命令:

rails server

bundle exec something:default

我知道我的Dockerfile只能有1条CMD线,所以可以这样做:

CMD ["sh", "-c", "rail server && bundle exec something:default"]

因为它只是那两个命令,我不想复制一个script.sh然后使用它(希望简单的1行方式)。

在一个容器中运行2个服务时,我应该注意哪种最佳做法?

4 个答案:

答案 0 :(得分:4)

最佳做法是在每个容器中运行一个服务,但这并不总是可行的。我运行CMD [“ sh”,“-c”,“ / usr / sbin / crond && php-fpm”],因此可以使用laravel调度程序。因此,在回答问题时,是的,上述方法确实有效。

答案 1 :(得分:2)

您可以创建一个bash脚本

#!/bin/bash
rail server
bundle exec something:default

然后将COPY添加到Dockerfile

COPY mycmd.sh /app

/ app是您的目的地

最后在CMD步骤中执行您的脚本

CMD [“mycmd.sh”]

答案 2 :(得分:0)

Docker容器正在运行,而其中的主进程正在运行。因此,如果您想在docker容器中运行两个服务,其中一个必须以后台模式运行。

因此,CMD图层应如下所示:

CMD ( rail server & ) && bundle exec something:default

答案 3 :(得分:0)

经验法则是每个容器有一个" 一个进程"。规则的目的是将应用程序分解为多个容器。看看这里Best practices for writing Dockerfiles - 每个容器应该只有一个问题

因此,如果您正在运行两个 Rails 应用程序,那么创建两个容器可能会更好。

运行这两种服务的方式有两个问题。首先,流程不受监督,因此容器无法正确管理它们。如果这是一个问题,请使用supervisord之类的流程管理器。见Run multiple services in a container。其次,服务由shell启动,因此信号将无法到达您的应用程序。