说我有命令:
rails server
和
bundle exec something:default
我知道我的Dockerfile只能有1条CMD线,所以可以这样做:
CMD ["sh", "-c", "rail server && bundle exec something:default"]
因为它只是那两个命令,我不想复制一个script.sh然后使用它(希望简单的1行方式)。
在一个容器中运行2个服务时,我应该注意哪种最佳做法?
答案 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启动,因此信号将无法到达您的应用程序。