ARG:定義構建鏡像時需要的參數、用戶可以在構建期間通過docker build --build-arg <varname>=<value>將其傳遞給構建器、如果指定了dockerfile中沒有定義的參數,則發發出警告,提示構建參數未被使用
語法形式: ARG <name>[=<default value>]
一個dockerfile中可以包含多個ARG參數
注意:不推薦在構建期間使用ARG傳遞密碼、個人認證之類的信息,因為任何人都可以通過docker history查看到構建期間傳遞的變量值
如果ARG指令有默認值並且在構建期間沒有接收到參數、則使用默認值
ARG變量定義從Dockerfile中定義的行開始生效,而不是在命令行或其他地方使用參數開始生效
在ARG指令定義變量之前、任何對該變量的引用返回的結果都是一個空字符串
一個ARG指令的有效范圍在其定義的構建階段內、如果要在多個階段中都有效、則必須在每個階段都飲食ARG指令。如下:
- FROM busybox
- ARG SETTINGS
- RUN ./run/setup $SETTINGS
- FROM busybox
- ARG SETTINGS
- RUN ./run/other $SETTINGS
ARG變量使用:
可以使用ARG或ENV指令來指定RUN指令可用的變量,如果ARG和ENV同時指定了一個相同名稱的變量、則ENV設置的變量會覆蓋ARG設置的變量。如下:
- 1 FROM ubuntu
- 2 ARG CONT_IMG_VER
- 3 ENV CONT_IMG_VER v1.0.0
- 4 RUN echo $CONT_IMG_VER
使用 docker build --build-arg CONT_IMG_VER=v2.0.1 .
最終輸出v1.0.0
實例2(接上例) :
- 1 FROM ubuntu
- 2 ARG CONT_IMG_VER
- 3 ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
- 4 RUN echo $CONT_IMG_VER
此處輸出v1.0.0 因為上例中ENV設置了其默認值為v1.0.0、由此可見,與ARG不同 ENV設置參數的有效期為整個構建期內
因此 我們可以從命令行傳遞參數、並通過ENV指令將其保存在最終鏡像中
預定義ARG:docker自身定義了一個ARG變量,此類變量不需要通過在dockerfile文件中執行ARG指令即可使用、如下:
- HTTP_PROXY
- http_proxy
- HTTPS_PROXY
- https_proxy
- FTP_PROXY
- ftp_proxy
- NO_PROXY
- no_proxy
這些變量可直接通過--build-arg <varname>=<vaue>傳遞
注:預定義變量不能通過docker history輸出,這是為了減少在HTTP_PROXY變量中意外泄漏敏感身份驗證信息的風險
待添加:對構建緩存的影響