Dockerfile中ENTRYPOINT无法解析ARG/ENV变量的问题求助
解决CentOS 7容器SCL环境配置与ENTRYPOINT参数传递问题
这里有几个可行的方案解决你的问题:
方案1:使用Shell形式ENTRYPOINT+环境变量传递参数
Docker的Shell形式ENTRYPOINT(非数组格式)会自动展开环境变量,并且能将docker run的命令行参数或CMD内容作为$@传递给脚本。具体步骤:
- 定义环境变量存储脚本路径:
ENV SCL_SCRIPT="/usr/local/bin/setup_scl.sh"
- 创建你的SCL配置脚本,务必在末尾添加
exec "$@"(让后续命令替换脚本进程,确保信号能正确传递,比如docker stop):
RUN echo '#!/bin/bash' > $SCL_SCRIPT && \ echo 'source scl_source enable <你的SCL包名>' >> $SCL_SCRIPT && \ echo 'exec "$@"' >> $SCL_SCRIPT && \ chmod +x $SCL_SCRIPT
- 使用Shell形式ENTRYPOINT调用变量:
ENTRYPOINT $SCL_SCRIPT "$@"
这样既不用重复写脚本路径,docker run的参数也能正常传递——比如执行docker run your-image bash,脚本会先配置SCL环境,然后启动bash。
方案2:修正/bin/sh -c的参数传递写法
如果你坚持用数组形式ENTRYPOINT,需要调整sh -c的参数格式,确保后续参数能被传递:
ENV SCL_SCRIPT="/usr/local/bin/setup_scl.sh" # 先创建脚本(同上,要加exec "$@") ENTRYPOINT ["/bin/sh", "-c", "exec $SCL_SCRIPT \"$@\"", "--"]
这里的--是告诉sh把后续的所有参数当作$@传递给脚本,而不是当作sh的选项。
为什么你之前的尝试失败?
- 数组形式ENTRYPOINT(
ENTRYPOINT [ ${ENTRYPOINT} ])不会解析环境变量,Docker会直接把${ENTRYPOINT}当作命令名,自然找不到; - 单纯用
ENTRYPOINT [ "/bin/sh", "-c", ${ENTRYPOINT} ]时,sh -c只会执行第一个参数的命令,后续的docker run参数不会被传递给脚本——因为sh -c的参数中,只有第一个是命令,后面的参数会被当作$0、$1等,而非$@。
内容的提问来源于stack exchange,提问作者kbro
相关产品推荐
相关产品推荐

