一千萬個為什麽

搜索

為什麽在使用Dockerfile在一個圖層中定義ENV時不能找到它?



當以下Dockerfile:

ENV A=123 \
    B=$A
RUN echo $B

運行,它會導致:

Step 2/2 : RUN echo $B
 ---> Running in x

 ---> y
Removing intermediate container z

當定義兩個 ENV 圖層時:

ENV A=123
ENV B=$A

有用:

Step 2/2 : RUN echo $B
 ---> Running in x
123
 ---> y
Removing intermediate container z

轉載註明原文: 為什麽在使用Dockerfile在一個圖層中定義ENV時不能找到它?

一共有 2 個回答:

ENV 關鍵字將被轉換為 export 命令(通常是shell的builin),如果您刪除了多行聲明,

export A=123 B=$A

這裏發生的情況是,當shell解析該行以將其輸入 export 輸入時, A 尚未導出並作為環境變量可用。

一步一步這將給予:

  • You type export A=123 B=$A
  • The shell parse the line and pass A=123 B= to export's stdin
  • export parse each argument in the form key=value and as such export A to be 123 and B to be empty

On the second form, A is available to the shell when the line is parsed, and as such the resulting export's stdin is B=123

ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

將導致def的值為hello,而不是再見。但是,ghi將具有再見值,因為它不是將abc設置為再見的命令的一部分。