在Dockerfile中,ENV
和ARG
是两个非常重要的指令。虽然它们看起来有点相似,但它们的作用和使用情境却有很大的不同。
=====================================================================
ARG指令
ARG
指令用于定义构建参数。它允许在构建映像时从外部传递参数,例如版本号、密钥等。在Dockerfile中,你可以使用ARG
指令来声明这些参数,并在后续的指令中使用这些参数。例如:
ARG VERSION=1.0
RUN echo "Version: $VERSION"
在这个例子中,我们定义了一个名为VERSION
的构建参数,并在RUN
指令中使用它。当我们使用docker build
命令构建映像时,可以使用--build-arg
选项来传递该参数的值。例如:
docker build --build-arg VERSION=2.0 .
ENV指令
相比之下,ENV
指令用于定义环境变量。这些变量在容器运行时是可用的,并且可以在容器内部的任何进程中使用。例如:
ENV DB_HOST localhost
在这个例子中,我们定义了一个名为DB_HOST
的环境变量,并将其设置为localhost
。在容器运行时,这个环境变量将在整个容器中可用。
区别
ARG
和ENV
指令的最大区别在于它们的作用域。ARG
指令定义的参数仅在构建映像期间可用,而ENV
指令定义的环境变量在容器运行时可用。因此,你可以使用ARG
指令来传递构建参数,而使用ENV
指令来设置容器的环境变量。
另一个区别是,ARG
指令可以由--build-arg
选项在构建时进行设置,而ENV
指令在构建时无法更改。因此,如果你需要在构建时传递某些参数,你应该使用ARG
指令。
重点来了
所以,有一种情况是,我希望在cmd中使用这个环境变量,而且这个变量我希望是通过构建传入的,现在我在编写Jenkinsfile时就遇到了这种场景。我会根据部署环境的不同,比如test和prod环境,而传入不同的java启动参数。
这种情况怎么处理呢?
解决方案是
# 先定义一个ARG变量ARG VAR_A 5# 再将ARG变量赋给ENV环境变量ENV VAR_B $VAR_A# 之后就可以再cmd执行时使用了CMD echo "My variable is $VAR_B"
build时可以传入参数
docker build --build-arg VAR_A=yunsheng -t argtest:4.0.0 .
最后,ARG
指令可以在FROM
指令之前使用,但ENV
指令则不能。这是因为FROM
指令之前的任何指令都在构建上下文中执行,而FROM
指令之后的指令则在新的构建阶段中执行。