如何在内置docker期间设置环境变量

如何在内置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

我试图在构建期间在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
结果是

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