【问题标题】:Commands to execute background process in Docker CMD在 Docker CMD 中执行后台进程的命令
【发布时间】:2015-10-12 02:13:01
【问题描述】:

我正在使用 Dockerfile 创建一个 docker 映像。我想在启动 docker 容器时执行一些脚本。目前我有一个 shell 脚本来执行所有必要的进程

CMD ["sh","start.sh"]

我想用后台运行的进程执行一个shell命令示例

CMD ["sh", "-c", "mongod --dbpath /test &"]

【问题讨论】:

  • 您可以使用docker run -d {image} 将容器作为后台进程启动,这就是您的意思吗?
  • 嗨,我想在 docker 容器中启动一个进程作为后台进程。所以目前我在 shell 脚本文件中提到了相同的内容并创建了一个 docker 映像。因此,当我运行 docker 映像时,它的进程按预期运行。但我不想拥有一个单独的 shell 脚本文件,我可以在 Dockerfile 中使用 CMD 命令在 docker 文件中执行此操作

标签: bash shell docker dockerfile


【解决方案1】:

当然还有如何启动多个服务的official Docker documentation,同样使用脚本文件而不是CMD。 docker 文档还说明了如何使用 supervisord 作为进程管理器:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY my_first_process my_first_process
COPY my_second_process my_second_process
CMD ["/usr/bin/supervisord"]

如果这是一个选项,您可以使用 phusion 基础镜像,它允许在一个容器中运行多个进程。因此,您可以使用runit 等服务主管运行系统服务(如 cron)或其他进程。

有关 phusion 基础映像是否适合您的用例的更多信息,请访问here

关于如何避免在容器中运行更多进程(您的应用除外)的重点说明,您可以找到 here。阐述过于详细,无法在 SO 上重复。

【讨论】:

    【解决方案2】:

    除了你的问题中的 cmets 已经指出了一些关于 Docker 最佳实践的事情之外,你无论如何都可以从你的 start.sh 脚本中启动一个 background 进程并将 start.sh 脚本本身保留在前景 使用 nohup 命令和 & 符号 (&)。我没有尝试使用mongod,但您的start.sh 脚​​本中的以下内容可以工作:

    #!/bin/sh
    ...
    nohup sh -c mongod --dbpath /test &
    ...
    

    【讨论】:

    • 这太可悲了。我们有很多优秀的流程管理器,但遗憾的是,Docker 不能很好地与 systemd 集成。
    • 你也可以试试 supervisord。
    • 我还发现以下链接非常有助于描述如何防止在 docker 容器中启动后台服务的必要性:runnable.com/docker/rails/run-multiple-processes-in-a-container
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2016-09-06
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多