Dockerfile中的ENV和ARG区别

1,548 阅读1分钟

在Dockerfile中,ENVARG是两个非常重要的指令。虽然它们看起来有点相似,但它们的作用和使用情境却有很大的不同。

=====================================================================

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。在容器运行时,这个环境变量将在整个容器中可用。

区别

ARGENV指令的最大区别在于它们的作用域。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指令之后的指令则在新的构建阶段中执行。