有多种方法可以运行多个命令,主要使用 shell:
- 使用
ENTRYPOINT 的“shell 形式”运行命令。 (然而,Dockerfile 参考更喜欢下面的“exec 形式”。)在幕后,这个“shell 形式”实际上运行一个 shell 二进制文件(如 /bin/sh)并让 shell 解释“脚本”(这里,@ 987654329@)。
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 或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(或任何生产环境)上以稳健且有弹性的方式运行服务的理想方式。