如何在不覆盖ENTRYPOINT的前提下执行Docker容器自定义命令
解决Docker ENTRYPOINT与自定义命令共存的问题
要实现先执行ENTRYPOINT指定的脚本,再运行docker run命令行末尾的自定义命令,只需修改脚本逻辑和Dockerfile配置即可,具体步骤如下:
1. 修改myscript.sh脚本,添加命令执行逻辑
在myscript.sh的末尾加入以下代码,让脚本执行完自身逻辑后,处理并运行传入的额外命令:
# 若有传入额外命令,则执行该命令 if [ $# -gt 0 ]; then exec "$@" fi
"$@"会完整保留传入的命令参数,保证命令能正确执行exec用于替换当前脚本进程,确保Docker容器能正确响应信号(比如Ctrl+C)
2. 调整Dockerfile(可选优化)
保持原有的ENTRYPOINT配置,同时可以添加CMD作为默认的空参数,确保不指定命令时脚本正常运行:
FROM ubuntu RUN blah blah ENTRYPOINT ["myscript.sh"] CMD [""]
测试验证
- 执行
docker run --rm -it FOO:脚本myscript.sh正常执行,无额外命令时容器按原逻辑运行 - 执行
docker run --rm -it FOO bash:脚本执行完成后,自动启动bash交互终端
原问题原因说明
之前的报错是因为docker run末尾的bash被当作参数传给了myscript.sh,但脚本没有处理这些额外参数,因此抛出“Extra argument bash.”的错误。修改脚本后,额外参数会被识别为命令并执行,实现了两种场景的兼顾。
内容的提问来源于stack exchange,提问作者Captain'Flam
相关产品推荐
相关产品推荐

