Docker为ENTRYPOINT参数自动添加单引号的问题及解决咨询
解决Docker ENTRYPOINT中进程替换被转义的问题
问题出在你用了exec形式的ENTRYPOINT(数组语法),这种模式下Docker会直接把数组里的每个元素原封不动传给/bin/bash,不会经过shell解析。<(echo '. ./mydir/scripttosource.sh')是bash的进程替换语法,需要shell来展开,但数组形式下它被当成了普通字符串参数,所以Docker会给它加引号,导致bash把它当成一个不存在的文件名,自然无法加载脚本。
给你几个可行的解决方案:
方案1:改用shell形式的ENTRYPOINT
直接用非数组的shell语法,这样Docker会启动一个shell来解析命令,进程替换就能正常工作:
ENTRYPOINT /bin/bash -rcfile <(echo '. ./mydir/scripttosource.sh')
方案2:预先生成rcfile文件
避免进程替换,在构建镜像时直接生成一个包含source命令的rc脚本,然后让bash加载这个文件:
# 在镜像构建阶段生成rc文件 RUN echo '. ./mydir/scripttosource.sh' > /tmp/startup_rc.sh ENTRYPOINT ["/bin/bash", "-rcfile", "/tmp/startup_rc.sh"]
这种方法更直观,也避免了shell语法解析的问题,适合需要复杂启动逻辑的场景。
方案3:通过bash -c包裹命令(嵌套shell)
如果一定要用exec形式,可以把整个命令作为参数传给bash -c,让内部shell解析进程替换:
ENTRYPOINT ["/bin/bash", "-c", "/bin/bash -rcfile <(echo '. ./mydir/scripttosource.sh')"]
不过这种嵌套写法不如前两种简洁,除非有特殊需求,一般不推荐。
内容的提问来源于stack exchange,提问作者Kevin Stallard
相关产品推荐
相关产品推荐

