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变量中意外泄漏敏感身份验证信息的风险
待添加:对构建缓存的影响