在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")"
这也只是输出文件描述符,我不确定你的计划。