shell - 重用继承图像的 CMD 或 ENTRYPOINT

标签 shell docker dockerfile

如何在容器启动/重启/附加时包含我自己的 shell 脚本 CMD,而不删除继承图像使用的 CMD

我正在使用它,它确实可以很好地执行我的脚本,但似乎覆盖了 PHP CMD:

FROM php

COPY start.sh /usr/local/bin

CMD ["/usr/local/bin/start.sh"]

我应该做些什么不同的事情?我正在避免复制/粘贴父图像的 ENTRYPOINT 或 CMD,这可能不是一个好方法。

最佳答案

正如评论中提到的,没有内置的解决方案。从 Dockerfile 中,您看不到当前 CMDENTRYPOINT 的值。如果您控制上游基础镜像并在其中包含此代码,那么拥有 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/

相关文章:

linux - 如何在不实际尝试登录的情况下检查 SSH 服务器是否正在监听主机

java - 通过 jdbc 运行 shell 命令

bash - 我如何编写一个小的 Bash shell 脚本来每 5 秒重复一次操作?

python - 为什么用 gunicorn 和 uwsgi 运行 flask app.run 有问题?

docker - 启动Docker容器会产生docker-credential-secretservice:连接已关闭

macos - 在所有子目录中的文件中查找和替换文本

Docker Compose 何时使用镜像而不是构建

docker - 使用可选 HTTP 模块的 nginx 编译选项创建 docker 镜像

docker - OSX Docker 在没有事件容器的情况下几乎总是消耗大约 4GB 的 RAM

php - 在docker上运行lumen api时出错(原因:php_network_getaddresses:getaddrinfo失败:名称或服务未知)