ARG
作用:定義創建鏡像過程中使用的變量
格式: ARG <name>[=<default value>]
詳解
- 在執行 docker build 時,可以通過 --build-arg <參數名>=<值> 來為聲明的變量賦值
- 當鏡像編譯成功后,ARG 指定的變量將不再存在(ENV指定的變量將在鏡像中保留)
- Docker內置了一些鏡像創建變量,用戶可以直接使用而無須聲明,包括(不區分大小寫)HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY
ARG 和 ENV 的區別
- ARG 定義的變量只會存在於鏡像構建過程,啟動容器后並不保留這些變量
- ENV 定義的變量在啟動容器后仍然保留
注意
不要通過 ARG 保存密碼之類的信息,因為 docker history 還是可以看到所有值的
ARG 指令有生效范圍
如果在 FROM 指令之前指定,那么只能用於 FROM 指令中
ARG DOCKER_USERNAME=library FROM ${DOCKER_USERNAME}/alpine RUN set -x ; echo ${DOCKER_USERNAME}
- 使用上述 Dockerfile 會發現無法輸出 ${DOCKER_USERNAME} 變量的值
- 要想正常輸出,必須在 FROM 之后再次指定 ARG
# 只在 FROM 中生效 ARG DOCKER_USERNAME=library FROM ${DOCKER_USERNAME}/alpine # 要想在 FROM 之后使用,必須再次指定 ARG DOCKER_USERNAME=library RUN set -x ; echo ${DOCKER_USERNAME}
多階段構建的時候,ARG 定義的變量,每個 FROM 都能用
# 這個變量在每個 FROM 中都生效 ARG DOCKER_USERNAME=library FROM ${DOCKER_USERNAME}/alpine RUN set -x ; echo 1 FROM ${DOCKER_USERNAME}/alpine RUN set -x ; echo 2
ARG 其他用法
暫時不舉例了,感覺應該不會用很多
https://docs.docker.com/engine/reference/builder/#arg