带有脚本的 CMD 和 ENTRYPOINT,相同的 Dockerfile

CMD and ENTRYPOINT with script, same Dockerfile

尝试 运行 基于图像的广告连播 Dockerfile:

...

ENTRYPOINT [ "./mybashscript", ";", "flask" ]
CMD [ "run" ]

我希望完整的命令是 ./mybashscript; flask run。 但是,在此示例中,pod / container 执行 ./mybashscript 但不执行 flask.

我还尝试了一些变体,例如:

...

ENTRYPOINT [ "/bin/bash", "-c", "./mybashscript && flask" ]
CMD [ "run" ]

现在,flask 被执行但 run 被忽略。

PS:我试图理解为什么这不起作用,并且我知道我可以将所有内容放入 entrypoint 或将所有内容推入 bash 脚本,但这不是重点。

在此处显示的两种情况下,您都使用 JSON 数组 exec form for ENTRYPOINT and CMD. This means no shell is run, except in the second case where you run it explicitly. The two parts are just combined together into a single command

第一个构造 运行 脚本 ./mybashscript,它必须是可执行的并且有一个有效的“shebang”行(可能是 #!/bin/bash)。该脚本传递了三个参数,您可以在 shell 变量 </code>、<code></code> 中看到:一个分号 <code>;flask, 和 run.

第二个构造运行s /bin/sh -c './mybashscript && flask' runsh -c 接受一个参数,即 mybashscript && flask;剩余的参数 run 被解释为位置参数,而 sh -c 命令会将其视为 [=30=].


你展示的ENTRYPOINTCMD的任意分割没有任何意义。两者之间唯一真正重要的区别是当您 运行 容器时更改 CMD 更容易,例如通过在 docker run 命令中将其放在图像名称之后。将所有命令放在命令部分或它的 none 中是有意义的,但实际上将一半命令放在一部分中,一半放在另一部分中是不合理的。

我在这里的第一遍是写:

# no ENTRYPOINT
CMD ./mybashscript && flask run

Docker 将在裸字符串 shell form 中为您插入一个 sh -c 包装器,因此 && 具有其通常的 Bourne-shell 含义。


此设置看起来像是您在尝试 运行 主容器命令之前的初始化脚本。为此,有一个使用 ENTRYPOINT 的合理标准模式。由于它通过 CMD 作为参数传递,因此脚本可以以 exec "$@" 到 运行 CMD 结束(可能在 docker run 命令中被覆盖)。入口点脚本可能看起来像

#!/bin/sh
# entrypoint.sh
./mybashscript
exec "$@"

(如果你写了 mybashscript,你也可以用 exec "$@" 行结束它,并使用该脚本作为入口点。)

在Docker文件中,将此包装脚本设置为ENTRYPOINT,然后将主要命令设置为CMD

ENTRYPOINT ["./entrypoint.sh"] # must be a JSON array
CMD ["flask", "run"]           # can be either form

如果您提供备用命令,它将替换 CMD,因此 exec "$@" 行将 运行 该命令而不是 Docker 文件中的命令,但是ENTRYPOINT 包装器仍然 运行s.

# See the environment the wrapper sets up
docker run --rm your-image env
# Double-check the data directory setup
docker run --rm -v $PWD/data:/data your-image ls -l /data

如果你真的想要使用sh -c形式和拆分ENTRYPOINT,那么sh -c中的命令必须读作$@ 找到它的位置参数(CMD),另外你需要知道第一个参数是 [=30=] 而不是 </code>。如果您写</p>,您显示的表格将起作用 <pre><code># not really recommended but it would work ENTRYPOINT ["/bin/sh", "-c", "./mybashscript && flask \"$@\"", "flask"] CMD ["run"]