【问题标题】:Run multiple scripts in docker image在 docker 镜像中运行多个脚本
【发布时间】:2019-01-17 22:09:09
【问题描述】:

您好,我想知道是否可以在 docker 容器启动时同时自动运行两个脚本。第一个脚本必须运行客户端应用程序,第二个运行服务器应用程序作为后台。

【问题讨论】:

  • 我使用流程管理器实现了这一点(在我的情况下为circus,但还有其他类似的解决方案)。这对于长时间运行的进程是有意义的(似乎是你的情况)。它还增加了一个好处,如果您不处理应用程序中的某些错误并且由于此异常而停止,马戏团将重新启动它。作为一个缺点(在某些情况下),它是 python 应用程序,因此它需要 python 运行时并且需要将库安装到您的 docker 容器中。
  • 不能只用2个容器吗?
  • OK Kami 但只有一个应用程序是 python。本我必须使用一个容器
  • @ProgShiled,只有一个应用程序是 python 不是问题。您可以使用这种方法运行任何脚本/应用程序。实际上,我一直在 docker 容器中使用这样的进程管理器运行 Java 应用程序。

标签: bash docker dockerfile


【解决方案1】:

你可以use CMD in your Dockerfileuse command & to run two command in parallel

CMD server_command & client_command

(其中server_command 是用于启动服务器的命令,client_command 是用于启动客户端的命令)

【讨论】:

  • 请注意,当client_command 完成时容器将退出,如果server_command 意外退出,Docker 不会注意到,并且像docker stop 这样的命令不会向任何一个进程发送信号。跨度>
  • 你救了我...
【解决方案2】:

如前所述,不建议使用多个进程。

尽管如此,在某些情况下需要有多个进程。在这些情况下,通常的方法是使用像 supervisor 这样的流程管理器。

【讨论】:

    【解决方案3】:

    Docker 对此的官方立场一直是最好只在容器中运行一个服务。话虽如此,他们还维护了非常强大的文档,超出了将多个服务放入单个容器的可能解决方案。

    https://docs.docker.com/config/containers/multi-service_container/

    简单总结一下,当你有多个服务时,你需要有某种类型的“init”进程来充当容器中所有服务的父进程。

    有两种方法可以做到这一点:

    1. 拥有一个将每个服务作为后台作业运行的 shell 脚本。
    2. 在容器内启动一个完整的初始化系统,并在此启动服务。

    两者都有问题。第一个是因为 bash 不是一个初始化系统,当它不像一个初始化系统时,您最终会遇到各种令人头疼的问题。第二个是因为初始化系统是一个非常繁重的东西,需要放入 docker 容器中。

    说了这么多,最好的解决方案是将你的服务分成两个容器。

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 2015-12-26
      • 1970-01-01
      • 2022-10-15
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多