gpt4 book ai didi

docker - dockerfile中cmd和入口点之间的区别

转载 作者:行者123 更新时间:2023-12-02 18:47:02 24 4
gpt4 key购买 nike

我是Docker的新手,对ockfile有一个简单的问题。我们可以在停靠文件中写入入口点和CMD。似乎在创建容器期间执行了入口点。并且在启动容器期间执行CMD。这是真的?

最佳答案

不完全是:

ENTRYPOINT 配置将作为可执行文件运行的容器。
因此它总是执行的(或者默认的/bin/sh -c是)。

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

Command line arguments to docker run <image> will be appended after all elements in an exec form ENTRYPOINT, and will override all elements specified using CMD.

The shell form prevents any CMD or run command line arguments from being used, but has the disadvantage that your ENTRYPOINT will be started as a subcommand of /bin/sh -c, which does not pass signals.
This means that the executable will not be the container’s PID 1 - and will not receive Unix signals - so your executable will not receive a SIGTERM from docker stop <container>.



您可以查看 CMD 作为 ENTRYPOINT的参数。
如果没有入口点(默认命令为“ /bin/sh -c”),则 CMD可包含可执行文件。
如果 ENTRYPOINT已经运行可执行文件,则CMD参数是该命令的参数(如果使用 docker run而没有其他参数)。

docker start 中所述,使用 issue 1437时,将执行 ENTRYPOINT,但仅使用 CMD中的参数(因此使用 CMD,但不能在命令行上使用自己的参数覆盖它)。
如果要使用CMD,则需要 docker run而不是 docker start

实际上,最近有一个正在进行的PR( PR 19746),它允许docker start命令采取可选的 --cmd( -c)标志来指定要使用的cmd,而不是cmd / entrypoint中的默认cmd。

Official Dockerfile documentation现在具有“ Understand how CMD and ENTRYPOINT interact”部分:

  • Dockerfile should specify at least one of CMD or ENTRYPOINT commands.
  • ENTRYPOINT should be defined when using the container as an executable.
  • CMD should be used as a way of defining default arguments for an ENTRYPOINT command or for executing an ad-hoc command in a container.
  • CMD will be overridden when running the container with alternative arguments.


这意味着,如果您的Dockerfile包括:

  • No CMD:

    • if No ENTRYPOINT: error, not allowed
    • ENTRYPOINT exec_entry p1_entry means /bin/sh -c exec_entry p1_entry
    • ENTRYPOINT ["exec_entry", "p1_entry"] means exec_entry p1_entry
  • CMD ["exec_cmd", "p1_cmd"] (one command, one parameter)

    • if No ENTRYPOINT: exec_cmd p1_cmd,
    • ENTRYPOINT exec_entry p1_entry means /bin/sh -c exec_entry p1_entry exec_cmd p1_cmd
    • ENTRYPOINT ["exec_entry", "p1_entry"] means exec_entry p1_entry exec_cmd p1_cmd
  • CMD ["p1_cmd", "p2_cmd"]

    • if No ENTRYPOINT: p1_cmd p2_cmd
    • ENTRYPOINT exec_entry p1_entry means /bin/sh -c exec_entry p1_entry p1_cmd p2_cmd (good)
    • ENTRYPOINT [“exec_entry”, “p1_entry”] means exec_entry p1_entry p1_cmd p2_cmd
  • CMD exec_cmd p1_cmd:

    • if No ENTRYPOINT: /bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT exec_entry p1_entry means /bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
    • ENTRYPOINT [“exec_entry”, “p1_entry”] means exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

关于docker - dockerfile中cmd和入口点之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35452760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com