【问题标题】:Run shell command while setting ENV in dockerfile [duplicate]在dockerfile中设置ENV时运行shell命令[重复]
【发布时间】:2020-04-17 07:33:27
【问题描述】:

在我的 dockerfile 中:


ENV MY_ENCODED_VALUE="bXkgbmFtZSBpcyByYWtpYgo="

ENV MY_DECODED_VALUE=$(echo $MY_ENCODED_VALUE | base64 -d)

在第二行中,我想解码编码值并将解码后的值放入我的环境变量中。


但我收到以下错误

Error response from daemon: failed to parse dockerfile: Syntax error - can't find = in "$MY_ENCODED_VALUE". Must be of the form: name=value


这到底是什么意思?这里的正确语法应该是什么?

【问题讨论】:

  • 您的“MY_ENCODED_VALUE”是静态的。我的意思是,每次构建新图像时,你愿意改变这个值还是让它保持不变?
  • 它将保持不变
  • @Rakib:你是不是只有在构建时才需要它?
  • 嗨@Technext @AndyWong 我只在构建过程中需要它。我在运行的容器中不需要它。所以我不想在docker run 中设置环境。目前,由于 dockerfile 中的语法,我无法使其工作。

标签: docker environment-variables dockerfile export


【解决方案1】:

正如您所提到的,您只需要在构建期间使用该变量,这应该可以完成工作:

Dockerfile:

FROM node:alpine
ENV MY_ENCODED_VALUE "bXkgbmFtZSBpcyByYWtpYgo="
RUN echo $MY_ENCODED_VALUE | base64 -d > /root/temp
RUN MY_DECODED_VALUE=$(cat /root/temp); echo "Output: $MY_DECODED_VALUE"

输出:

$ docker build -t test .
Sending build context to Docker daemon   2.56kB
Step 1/4 : FROM node:alpine
 ---> bcfeabd22749
Step 2/4 : ENV MY_ENCODED_VALUE "bXkgbmFtZSBpcyByYWtpYgo="
 ---> Using cache
 ---> 81084f4be2e4
Step 3/4 : RUN echo $MY_ENCODED_VALUE | base64 -d > /root/temp
 ---> Using cache
 ---> b8ad3a100746
Step 4/4 : RUN MY_DECODED_VALUE=$(cat /root/temp); echo "Output: $MY_DECODED_VALUE"
 ---> Running in c9c41b92dee0
Output: my name is rakib
Removing intermediate container c9c41b92dee0
 ---> acfcd422a8ed
Successfully built acfcd422a8ed
Successfully tagged testing:latest

注意:

1) 我的Dockerfile 最后一行中的RUN 指令用于后面部分,即echo 命令。在 echo 命令之前分配变量 [MY_DECODED_VALUE=$(cat /root/temp)] 可确保将变量设置在您要使用它的同一层中。

2) 我使用变量赋值的方式,它不会像 ENV 指令所期望的那样运行,即它不能跨层使用。如果要在多个层中使用变量,则必须在适用的情况下使用RUN MY_DECODED_VALUE=$(cat /root/temp); <your-command-that-uses-the-variable>。不是一个优雅的,但这就是它与我的解决方案一起使用的方式。

【讨论】:

  • 这行不通。它不会执行命令。它将环境变量设置为原始字符串:MY_DECODED_VALUE=$(echo bXkgbmFtZSBpcyByYWtpYgo= | base64 -d)MY_ENCODED_VALUE=bXkgbmFtZSBpcyByYWtpYgo=
  • @kapilKhandelwal 是对的。它设置整个原始字符串
  • @Technext 您已经使用RUN 提供了更新的解决方案。但我的帖子使用的是ENV。使用 ENV 不可能做到这一点吗?我的设置需要 ENV。
  • 该行中的RUN 指令实际上是用于后面的部分,即echo 命令。我们只是确保将变量设置在您想要使用它的 same 层中。
  • 不幸的是,这不能达到目的。当容器启动时,我们不能在其他任何地方使用该值。
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
相关资源
最近更新 更多