Windows Dockerfile中Git Bash作为SHELL时命令参数失效问题求助
解决Git Bash在Dockerfile中RUN命令参数失效的问题
问题根源
当你将Docker的SHELL配置为["bash", "-euo", "pipefail", "-c"]时,执行RUN ls -l会被Docker解析为:
bash -euo pipefail -c ls -l
而bash的-c选项仅会将紧随其后的第一个参数(这里是ls)作为要执行的命令字符串,后续的-l会被当作bash自身的位置参数(而非传给ls),因此实际只执行了无参数的ls。
解决方案
方法1:通过cmd.exe包裹传递完整命令字符串
修改Dockerfile中的SHELL配置为:
SHELL ["cmd.exe", "/S", "/C", "bash", "-euo", "pipefail", "-c"]
cmd.exe的/S /C参数会将后续的整个命令行(比如ls -l)合并为单个字符串传递给bash的-c选项,最终执行的命令等价于:
bash -euo pipefail -c "ls -l"
这样-l参数就能正确被ls识别,且你依然可以使用无引号的RUN ls -l写法。
方法2:使用自定义脚本合并参数
- 创建一个名为
run_bash.sh的脚本,内容如下:
#!/bin/bash exec bash -euo pipefail -c "$*"
- 在Dockerfile中添加以下内容:
COPY run_bash.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/run_bash.sh SHELL ["run_bash.sh"]
之后执行RUN ls -l时,脚本会将所有参数合并为单个字符串传给bash的-c选项,确保参数正确传递。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

