【问题标题】:Dockerfile, docker-compose and swarm mode lifecycleDockerfile、docker-compose 和 swarm 模式生命周期
【发布时间】:2019-05-27 23:06:34
【问题描述】:

我正在使用 docker 3.5。在这个 docker 版本中,我在开始时遇到了节点依赖关系的问题。我尝试解决它,因为建议使用外部 sh 脚本处理 docker 文件。它导致更多的问题。例如,`脚本存在,但未检测到执行,已执行,但程序未启动。我的 docker-compose 启动了,但是 swarm 模式失败等等......

我想我不清楚 Docker 生命周期。假设我们有Dockerfiledocker-compose.ymldocker-swarm.yml。他们每个人都有一个CMDENTRYPOINT指令。

开始docker-compose 我可以检测到我的服务正在等待所需的服务(因为等待脚本)。如果我使用 swarm 模式,我会失败并且我的服务无法正常启动。

您能帮忙考虑一下生命周期吗?

有说明:

  • CMD(泊坞窗文件)
  • 入口点(泊坞窗文件)
  • 入口点(docker-compose)
  • 命令(docker-compose)
  • 入口点(docker-swarm)
  • 命令(docker-swarm)

是否可以获取不同场景下指定指令的执行顺序信息?

【问题讨论】:

    标签: docker docker-compose docker-swarm-mode


    【解决方案1】:

    入口点和命令之间没有“执行顺序”,无论它是在您的映像(Dockerfile)中定义还是在运行时被覆盖(使用 compose 文件或 cli 参数)。 docker 只会运行一个命令来启动您的容器,当该命令退出时,容器就会退出。

    如果你只定义一个入口点或一个命令,docker 会运行它。如果您同时定义了入口点和命令,docker 会将命令作为参数附加到入口点。所以如果你有:

    ENTRYPOINT ["/bin/app", "arg1"]
    CMD ["script.sh", "arg2"]
    

    Docker 将使用以下命令运行您的容器:

    /bin/app arg1 script.sh arg2
    

    表示script.sh 作为cli 参数传递给/bin/app


    如果你使用 shell/string 语法而不是 exec/json 语法,这可能会有点奇怪,因为 shell 语法用 /bin/sh -c "$string" 包装你的命令,更重要的是,-c arg 到 @987654327 @ 只接受一个参数。这意味着:

    ENTRYPOINT /bin/app arg1
    CMD script.sh arg2
    

    将运行:

    /bin/sh -c "/bin/app arg1" /bin/sh -c "script.sh arg2"
    

    最终会运行:

    /bin/app arg1
    

    在运行入口点脚本后调用命令的标准工作流程是在 entrypoint.sh 脚本的末尾包含以下行:

    exec "$@"
    

    它将向入口点脚本运行任何 cli 参数,通常是 CMD 的值,作为新的 pid 1。

    【讨论】:

    • 我不明白为什么“script.sh arg2”被丢弃了?
    • 在第二个例子中? -c 只接受一个参数。其他参数可作为$1 等用于正在运行的字符串,但该字符串不包含$1 之类的任何内容。
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2021-02-07
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多