如何在内置docker期间设置环境变量
我试图在构建期间在docker容器中设置环境变量,但没有成功。在使用run命令时设置它们是有效的,但我需要在构建过程中设置它们 Dockerfile如何在内置docker期间设置环境变量,docker,dockerfile,Docker,Dockerfile,我试图在构建期间在docker容器中设置环境变量,但没有成功。在使用run命令时设置它们是有效的,但我需要在构建过程中设置它们 Dockerfile FROM ubuntu:latest ARG TEST_ENV=something 我用来构建的命令 docker build -t --build-arg TEST_ENV="test" myimage . 运行 docker run -dit myimage 我正在使用 docker exec containerid printenv
FROM ubuntu:latest
ARG TEST_ENV=something
我用来构建的命令
docker build -t --build-arg TEST_ENV="test" myimage .
运行
docker run -dit myimage
我正在使用
docker exec containerid printenv
结果是
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e49c1abfd58b
TERM=xterm
no_proxy=*.local, 169.254/16
HOME=/root
TEST_ENV不存在
ARG
用于设置在docker构建过程中使用的环境变量-它们不存在于最终图像中,这就是为什么在使用docker run
时看不到它们的原因
您可以使用ARG
进行设置,这些设置仅在生成映像时相关,并且从映像运行的容器不需要这些设置。您可以使用ENV
作为构建期间和容器中使用的环境变量
使用此Dockerfile:
FROM ubuntu
ARG BUILD_TIME=abc
ENV RUN_TIME=123
RUN touch /env.txt
RUN printenv > /env.txt
您可以像使用docker build-t temp--build arg build\u TIME=def那样覆盖build arg。
。然后你得到你所期望的:
> docker run temp cat /env.txt
HOSTNAME=b18b9cafe0e0
RUN_TIME=123
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
BUILD_TIME=def
PWD=/
我将总结这篇优秀文章的亮点
ARG Vs ENV
1)简短解释:
ARG仅在构建Docker映像(运行等)期间可用,而不是在创建映像并从中启动容器(ENTRYPOINT,CMD)之后可用
ENV值可用于容器,但也可在Docker构建期间从引入样式命令的行开始运行样式命令。
如果使用bash在中间容器中设置环境变量(运行export VARI=5&&…),它将不会保留在下一个命令中
2)更详细的解释:
ARG也称为构建时变量。它们仅在Dockerfile中使用ARG指令“宣布”它们的那一刻起,直到生成映像的那一刻起才可用。正在运行的容器无法访问ARG变量的值。这也适用于CMD和ENTRYPOINT指令,它们只是告诉容器在默认情况下应该运行什么。如果在运行build命令时告诉Dockerfile需要各种ARG变量(没有默认值),但没有提供任何变量,则会出现错误消息
但是,通过查看图像的docker历史记录,可以在构建图像后轻松检查ARG值。因此,它们对于敏感数据来说是一个糟糕的选择
ENV变量在构建过程中也可用,只要您使用ENV指令引入它们。但是,与ARG不同,它们也可以通过从最终图像开始的容器访问。在启动容器时,可以覆盖环境值,详情如下
3)带diagram:
以下是有关从Dockerfile构建Docker映像和运行容器的流程的ARG和ENV可用性的简化概述
$ docker run -e env_var_name alpine env
它们重叠,但不能从容器内部使用ARG
设置ARG和ENV值
设置参数值
因此,您有了Dockerfile
,它定义了ARG
和ENV
值。如何设置,在哪里设置?您可以在Dockerfile
中将它们保留为空,或设置默认值。如果没有为没有默认值的预期ARG变量提供值,则会收到错误消息
下面是一个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"
# you could also use braces - ${some_variable_name}
从命令行生成Docker映像时,可以使用–build ARG
设置ARG
值:
$ docker build --build-arg some_variable_name=a_value
使用上面的Dockerfile
运行该命令将导致打印以下行(以及其他行):噢,该死,看看这个a_值
那么,这如何转化为使用docker compose.yml
文件呢
使用docker compose时,您可以在args块中为ARG
指定要传递的值:
(docker-compose.yml文件)
当您试图设置的变量不是Dockerfile
中提到的ARG
时,Docker会抱怨
设置环境值
那么,如何设置ENV
值呢?您可以在启动容器时执行此操作(我们将在下面介绍),但也可以通过硬编码直接在Dockerfile
中提供默认的ENV
值。此外,您还可以为环境变量设置动态默认值
构建图像时,您只能提供ARG
值,如上所述。不能直接为ENV
变量提供值。但是,ARG
和ENV
可以一起工作。您可以使用ARG设置ENV
vars的默认值
下面是一个基本的Dockerfile
,使用硬编码的默认值:
# 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
下面是一个Dockerfile
的代码片段,使用动态的构建环境值:
# 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!
构建映像后,可以从命令行或使用docker compose.yml
文件以三种不同的方式启动容器并为ENV
变量提供值
所有这些都将覆盖Dockerfile
中的任何默认ENV
值
与ARG
不同,您可以将各种环境变量传递给容器。即使是在Dockerfile
中未明确定义的
不过,这取决于您的应用程序
选项1:逐个提供值
在命令行中,使用-e标志:
$ docker run -e "env_var_name=another_value" alpine env
从docker compose.yml
文件:
version: '3'
services:
plex:
image: linuxserver/plex
environment:
- env_var_name=another_value
选项2:从主机传递环境变量值
与上述方法相同
唯一的区别是,您不提供值,只需命名变量。这将使Docker访问主机环境中的当前值,并将其传递给c
$ docker run -e env_var_name alpine env
version: '3'
services:
plex:
image: linuxserver/plex
environment:
- env_var_name
env_var_name=another_value
$ docker run --env-file=env_file_name alpine env
version: '3'
services:
plex:
image: linuxserver/plex
env_file: env_file_name