在docker build 期间无法使用进程替换,因为 bash 进入posix 模式

问题:

在 docker build 期间无法使用进程替换,因为 bash 进入 posix 模式 在 Dockerfile 中,我想使用进程替换: RUN echo <(echo ' D A T A : ′ " DATA:'" DATA:"DATA") 但是docker build使用/bin/sh运行每个 RUN 命令。显然作为sh运行会导致 bash 切换到 POSIX 模式,该模式不允许进程替换: /bin/sh: -c: 第 0

问题:在 docker build 期间无法使用进程替换,因为 bash 进入 posix 模式 在 Dockerfile 中,我想使用进程替换:

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

但是docker build使用/bin/sh运行每个 RUN 命令。显然作为sh运行会导致 bash 切换到 POSIX 模式,该模式不允许进程替换:

/bin/sh: -c: 第 0 行:意外标记 `(' 附近的语法错误

我尝试关闭 POSIX 模式:

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

但似乎语法错误甚至在第一个命令运行之前就发生了。如果我用;替换&&也是一样的。

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

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

运行 ls -l /bin/sh

---> 在 93a9809e12a7 中运行

解答

如果您确定正在构建的映像中有bash,那么您可以使用SHELL命令更改 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值