Dockerfiles ENV和ARG的应用

本文详细解析了Docker中的ENV和ARG指令的区别及应用。.env文件用于docker-compose.yml,而env_file则用于Dockerfile中大量环境变量的管理。ARG在构建镜像时有效,可用于设置构建参数,但构建后失效。ENV不仅在构建时有效,还在容器运行时作为环境变量存在,可被重写。文章通过实例展示了ARG和ENV的用法,以及它们如何共同作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://vsupalov.com/docker-arg-env-variable-guide/#arg-and-env-availability

在写Dockerfile时, ENV和ARG,包括.env都是很容易弄混的概念。让我们对其进行区分。

.env文件

和docker-compose.yml配合使用。并不和Dockerfile一起使用

env_file

在Dockerfile中使用,当环境变量很多,可食用该参数,指定对应的变量文件。

ARG

在Dockerfile中使用,仅仅在build docker image的过程中(包括CMD和ENTRYPOINT)有效,在image被创建和container启动之后,无效。

 如果你在Dockerfile中使用了ARG但并未给定初始值,则在运行docker build的时候未指定该ARG变量,则会失败。

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

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

# In the Dockerfile
ARG some_variable_name
# or with a hard-coded default:
#ARG some_variable_name=default_value

RUN echo "Oh dang look at that $some_variable_name"

# In the shell command
docker build --build-arg some_variable_name=a_value

# Then you will get
Oh dang look at that a_value

ENV

在Dockerfile中使用,在build docker imag的过程中有效,在image被创建和container启动后作为环境变量依旧也有效,并且可以重写覆盖。printenv可查看其值。

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

# no default value
ENV hey
# a default value
ENV foo /bar
# or ENV foo=/bar

# ENV values can be used during the build
ADD . $foo
# or ADD . ${foo}
# translates to: ADD . /bar

# Use the following docker commands to set env

docker run -e "env_var_name=another_value" alpine env
docker run -e env_var_name alpine env
docker run --env-file=env_file_name alpine env

有时候,ARG和ENV一起使用,实例如下图:

# expect a build-time variable
ARG A_VARIABLE
# use the value to set the ENV var default
ENV an_env_var=$A_VARIABLE
# if not overridden, that value of an_env_var will be available to your containers!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值