在Docker构build期间不能使用进程replace,因为bash进入posix模式

在Dockerfile中,我想使用进程replace:

RUN echo <(echo '$DATA:'"$DATA") 

但是docker build使用/bin/sh运行每个RUN命令。 显然正在运行的sh导致bash切换到POSIX模式,这不允许进程replace:

 /bin/sh: -c: line 0: syntax error near unexpected token `(' 

我试过closuresPOSIX模式:

 RUN set +o posix && echo <(echo '$DATA:'"$DATA") 

但是,即使在第一个命令运行之前,语法错误似乎也会发生。 同样如果我用&&replace&& ;

请注意,该命令(即使是我在这里用作简化示例的命令)也包含单引号和双引号,所以我不能简单地将bash -c加在前面。

使用的shell实际上是一个bash,但是它被docker调用为/bin/sh

 Step 7 : RUN ls -l /bin/sh ---> Running in 93a9809e12a7 lrwxrwxrwx 1 root root 9 Dec 28 03:38 /bin/sh -> /bin/bash 

假设你的sh不是bash ,你不能直接在shell模式下使用进程replace; 你需要产生一个bash会话(非login,非交互式):

 RUN [ "/bin/bash", "-c", "echo <(echo '$DATA:'\"$DATA\")" ] 

在这里,我使用了json (aka exec )表单来确保引号很容易pipe理,在这里你只需要在$DATA\"$DATA\"周围的引号就可以避免引用json


如果你的sh实际上是bash ,那么应该这样做:

 RUN "echo <(echo '$DATA:'"$DATA")" 

这也只是输出文件描述符,我不确定你的计划。