Bash brace扩展不适用于Dockerfile运行命令

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

我正在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,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
的符号链接。因此,值得你翻过公认的答案。