Dockerfile ARG 构建参数
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动
目前,
星球
内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4
,手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观
。
ARG
指令用于指定构建参数,与 ENV
功能一样,都是设置环境变量。不同点在于作用域不一样, ARG
声明的环境变量仅对 Dockerfile 内有效,也就是说仅对 docker build
的时候有效,将来容器运行的时候不会存在这些环境变量的。
使用格式如下:
ARG <参数名>[=<默认值>]
ARG 注意点
一、脱敏数据安全问题
不要使用 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}
对于多阶段构建,尤其要注意这个问题:
# 这个变量在每个 FROM 中都生效
ARG DOCKER_USERNAME=library
FROM ${DOCKER_USERNAME}/alpine
RUN set -x ; echo 1
FROM ${DOCKER_USERNAME}/alpine
RUN set -x ; echo 2
对于上述 Dockerfile 两个 FROM
指令都可以使用 ${DOCKER_USERNAME}
,对于在各个阶段中使用的变量都必须在每个阶段分别指定:
ARG DOCKER_USERNAME=library
FROM ${DOCKER_USERNAME}/alpine
# 在FROM 之后使用变量,必须在每个阶段分别指定
ARG DOCKER_USERNAME=library
RUN set -x ; echo ${DOCKER_USERNAME}
FROM ${DOCKER_USERNAME}/alpine
# 在FROM 之后使用变量,必须在每个阶段分别指定
ARG DOCKER_USERNAME=library
RUN set -x ; echo ${DOCKER_USERNAME}