在Dockerfile中,我想使用进程替换:
RUN echo <(echo '$DATA:'"$DATA")
但是docker build
使用/bin/sh
运行每个RUN命令。显然以sh
运行会导致bash切换到POSIX模式,这不允许进程替换:
/bin/sh: -c: line 0: syntax error near unexpected token `('
我尝试关闭POSIX模式:
RUN set +o posix && echo <(echo '$DATA:'"$DATA")
但似乎在第一个命令运行之前就会发生语法错误。如果我将&&
替换为;
,则相同。
请注意,该命令(即使是我在此处用作简化示例的命令)也包含单引号和双引号,因此我不能简单地添加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
答案 0 :(得分:0)
假设您的sh
不是bash
,则无法直接在shell
模式下使用流程替换;你需要产生一个bash
会话(非登录,非交互式):
RUN [ "/bin/bash", "-c", "echo <(echo '$DATA:'\"$DATA\")" ]
在这里,我使用json
(又名exec
)表单来确保引号易于管理,在这里您只需要在$DATA
周围转义引号:\"$DATA\"
- 事先阻止json
解释。
如果您的sh
实际上是bash
,则应执行以下操作:
RUN "echo <(echo '$DATA:'"$DATA")"
这也只是输出文件描述符,我不能确定你的计划。
答案 1 :(得分:0)
如果您确定要在映像中构建bash
,则可以使用another question中描述的SHELL
命令来更改外壳程序调用。
您可以使用SHELL [ "/bin/bash", "-c" ]
。考虑:
$ docker build --no-cache - < <(echo '
> FROM fedora
> RUN cat <(echo hello world)
> ')
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM fedora
---> ef49352c9c21
Step 2/2 : RUN cat <(echo hello world)
---> Running in 573730ced3a3
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `cat <(echo hello world)'
The command '/bin/sh -c cat <(echo hello world)' returned a non-zero code: 1
$ docker build --no-cache - < <(echo '
> FROM fedora
> SHELL ["/bin/bash", "-c"]
> RUN cat <(echo hello world)
> ')
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM fedora
---> ef49352c9c21
Step 2/3 : SHELL ["/bin/bash", "-c"]
---> Running in e78260e6de42
Removing intermediate container e78260e6de42
---> ff6ec782a9f6
Step 3/3 : RUN cat <(echo hello world)
---> Running in afbb42bba5b4
hello world
Removing intermediate container afbb42bba5b4
---> 25f756dcff9b
Successfully built 25f756dcff9b