带有脚本的 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' run
。 sh -c
接受一个参数,即 mybashscript && flask
;剩余的参数 run
被解释为位置参数,而 sh -c
命令会将其视为 [=30=]
.
你展示的ENTRYPOINT
和CMD
的任意分割没有任何意义。两者之间唯一真正重要的区别是当您 运行 容器时更改 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"]
尝试 运行 基于图像的广告连播 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' run
。 sh -c
接受一个参数,即 mybashscript && flask
;剩余的参数 run
被解释为位置参数,而 sh -c
命令会将其视为 [=30=]
.
你展示的ENTRYPOINT
和CMD
的任意分割没有任何意义。两者之间唯一真正重要的区别是当您 运行 容器时更改 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"]