有多种方法可以运行多个命令,主要使用 shell:
- 使用
ENTRYPOINT
. (但是,Dockerfile
参考文献更喜欢下面的“exec 形式”。)在幕后,这个“shell 形式”实际上运行一个 shell 二进制文件(如/bin/sh
)并让 shell 解释“脚本”(此处为echo one && echo two
)。
FROM ubuntu:bionic
ENTRYPOINT echo one && echo two
- 使用
ENTRYPOINT
. 在这种情况下,直接调用 shell 二进制文件。
FROM ubuntu:bionic
ENTRYPOINT ["/bin/sh", "-c", "echo one && echo two"]
- 如果命令变得复杂,请考虑将它们放在一个文件中。与上面没有真正不同的是,现在 shell 二进制文件(如
#/bin/sh
下面文件顶部所示)解释了脚本文件中的内容。
echo -e '#/bin/sh'"\necho one && echo two" > my-entrypoint.sh
FROM ubuntu:bionic
COPY my-entrypoint.sh /
RUN chmod +x /my-entrypoint.sh
ENTRYPOINT /my-entrypoint.sh
- 像上面一样,但使用“执行形式”。
ENTRYPOINT ["/bin/sh", "-c", "/my-entrypoint.sh"]
(仅供参考,您可以使用ENTRYPOINT
or组合CMD
,但我不会深入讨论,因为执行多个命令通常ENTRYPOINT
就足够了。您可以查看Dockerfile
参考以了解如何ENTRYPOINT
和CMD
交互。)
对于 Jib,您可以使用<container><entrypoint>
/container.entrypoint
自定义图像入口点。(检查Maven和Gradle参考资料。)您可以使用该<extraDirectories>
功能(Maven / Gradle)提供任意文件,包括 shell 脚本。此外,还<extraDirectories>
允许使用<permissions>
例如给 shell 脚本提供可执行位。
另请注意,Jib 使用的默认 Java 基本映像没有/bin/sh
二进制文件(shell),因此您必须使用具有 shell 的不同基本映像。
最后,请注意,我只是在回答如何实现为容器映像运行多个命令。这不一定是在 Kubernetes(或任何生产环境)上以稳健且有弹性的方式运行服务的理想方式。