向 Dockerfile 传参 :--build-arg

ARG

ARG是一个构建时有效的变量。它们只能从在Dockerfile中使用ARG指令开始到生成docker image的那一端时间内使用。正在运行的容器无法访问ARG变量的值。这也适用于CMD和Enrypoint指令,它们只是告诉容器在默认情况下应该运行什么。如果您告诉Dockerfile需要各种ARG变量(即从外部传递参数),需要配合--build-arg参数来指定参数值,但是如果在运行docker build命令时没有提供任何变量,那么就会出现错误消息。

虽然其在container启动后不再生效,但是使用‘docker history’可以查看到。所以,敏感数据不建议使用ARG.

设置ARG和使用ARG编译image, 实例如下:

#外部传入tomcat的版本
ARG TOMCAT_VERSION

#基础镜像tomcat
FROM tomcat:$TOMCAT_VERSION

#定义 变量
ENV Tomcat_Home /usr/local/tomcat
ENV WEBAPP $Tomcat_Home/webapps

#配置工作目录
WORKDIR $Tomcat_Home/webapps
# 容器暴露8080端口
EXPOSE 8080
#启动容器
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

之后在shell命令行中我们可以执行如下命令:

#在Dockerfile中使用ARG定义的变量名一定要和--build-arg后面的变量名一致
docker build --build-arg TOMCAT_VERSION=8.5.18 -t mytomcat:v1.0.0 .

ENV

在Dockerfile中有一个和ARG功能类似的指令ENV,它在构建 docker imag的过程中有效,在image被创建和container启动后作为环境变量依旧也有效,并且可以重写覆盖。printenv可查看其值。下图是ARG和ENV的作用域示意图:

设置ENV和使用env,实例如下

#定义了一个没有初始值的变量
#后面可以通过docker run -e WORKSAPCE=XXXX来自定参数,如果没指定参数,容器不会启动
ENV WORKSPACE

#定义了一个给定初始值的变量 ,等价写法是ENV ROOT=/usr/local
#也可以使用docker run -e ROOT=XXX来指定参数值,如果没有指定也不影响容器启动
ENV ROOT /usr/local/

#ENV变量可以在构建的时候使用
ADD  ./  $ROOT

对于没有设定初始值的ENV变量,我们可以在docker容器启动的时候指定变量的参数:

docker run -e 

参考

留言区

还能输入500个字符