dockerfile深入学习之ARG


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变量中意外泄漏敏感身份验证信息的风险

待添加:对构建缓存的影响


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM