如何在容器启动/重启/附加时包含我自己的 shell 脚本 CMD
,而不删除继承图像使用的 CMD
?
我正在使用它,它确实可以很好地执行我的脚本,但似乎覆盖了 PHP CMD
:
FROM php
COPY start.sh /usr/local/bin
CMD ["/usr/local/bin/start.sh"]
我应该做些什么不同的事情?我正在避免复制/粘贴父图像的 ENTRYPOINT 或 CMD,这可能不是一个好方法。
最佳答案
正如评论中提到的,没有内置的解决方案。从 Dockerfile 中,您看不到当前 CMD
或 ENTRYPOINT
的值。如果您控制上游基础镜像并在其中包含此代码,那么拥有 run-parts
解决方案会很好,从而允许下游组件进行更改。但是 docker 有一个固有的问题会导致问题,容器应该只运行一个需要在前台运行的命令。因此,如果上游镜像启动,它将继续运行,而不会让您的后续步骤有机会运行,因此您需要确定运行命令的顺序以确保单个命令最终运行而不会退出。
我个人的偏好是一个更简单且硬编码的选项,添加我自己的命令或入口点,并使我的命令的最后一步 exec
成为上游命令。您仍然需要手动识别要从上游 Dockerfile 调用的脚本名称。但现在在您的 start.sh
中,您将拥有:
#!/bin/sh
# run various pieces of initialization code here
# ...
# kick off the upstream command:
exec /upstream-entrypoint.sh "$@"
通过使用 exec
调用,您可以将 pid 1 传输到上游入口点,以便正确处理信号。尾随的 "$@"
传递任何命令行参数。如果您想在自己的 start.sh
脚本中处理和提取一些 args,您可以使用 set
来调整 $@
的值.
关于shell - 重用继承图像的 CMD 或 ENTRYPOINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42280792/