Bash brace扩展不适用于Dockerfile运行命令
我正在Dockerfile中运行以下RUN命令,希望在列出的每个子目录下创建一个“logs”目录:Bash brace扩展不适用于Dockerfile运行命令,bash,docker,dockerfile,brace-expansion,Bash,Docker,Dockerfile,Brace Expansion,我正在Dockerfile中运行以下RUN命令,希望在列出的每个子目录下创建一个“logs”目录: RUN mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs 但是当我检查图像时,我看到在/opt/seagull下创建了一个名为“{diameter env,h248 env,http env,msrp env
RUN mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs
但是当我检查图像时,我看到在/opt/seagull下创建了一个名为“{diameter env,h248 env,http env,msrp env,octcap env,radius env,sip env,synchro env,xcap env}”的目录,而不是进行大括号扩展
我可能做错了什么?您没有使用大括号扩展,因为您没有使用Bash。如果您查看以下内容: RUN(shell形式,命令在shell中运行,Linux上默认为/bin/sh-c,Windows上默认为cmd/S/c) 而且: 注意:要使用“/bin/sh”以外的其他shell,请使用传入所需shell的exec表单。例如,运行[“/bin/bash”、“-c”、“echo hello”] 因此,只需将命令更改为使用exec表单并显式使用Bash shell:
RUN [ "/bin/bash", "-c", "mkdir -p /opt/seagull/{diameter-env,h248-env,http-env,msrp-env,octcap-env,radius-env,sip-env,synchro-env,xcap-env}/logs" ]
如果映像中提供了
/bin/bash
,则可以更改docker build系统用于执行RUN
命令的shell,如下所示:
SHELL ["/bin/bash", "-c"]
现在,您的
RUN
命令应该可以不变地工作。我不知道其中一种方法,但是RUN
是否在bash下运行?结果是,这取决于您使用的是shell表单还是exec表单。请看下面我的答案。谢谢!我不敢相信我花了45分钟在这上面,尝试不同的转义技术,检查默认bash设置,等等,什么?你已经回答了自己的问题,并为此感谢自己……?是的!:)这是一个让人筋疲力尽的一天,我需要感谢自己终于成功了。而且,并不是回答自己的问题让我感到困惑,这只是评论,但是嘿,如果这是应得的;如果你不能ln-f/bin/bash/bin/sh
,我相信原因是现在的/bin/sh
通常是指向/bin/dash
的符号链接。因此,值得你翻过公认的答案。