如何在构建Docker期间设置环境变量

jc3wubiy  于 2023-01-29  发布在  Docker
关注(0)|答案(2)|浏览(270)

我试图在构建过程中设置docker容器中的环境变量,但没有成功。使用运行命令时设置它们可以工作,但我需要在构建过程中设置它们。

停靠文件
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不存在

vu8f3i0k

vu8f3i0k1#

ARG用于设置docker build过程中使用的环境变量-它们不存在于最终映像中,这就是为什么在使用docker run时看不到它们。
您可以使用ARG来设置仅在构建映像时相关的设置,并且从映像运行的容器不需要这些设置。您可以使用ENV来设置在构建期间和容器中使用的环境变量。
使用此停靠文件:

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_TIME=def .中那样覆盖构建参数,然后得到你所期望的结果:

> 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=/
8yparm6h

8yparm6h2#

我将总结this这篇优秀文章的亮点。

阿根廷Vs ENV

***1)简短说明:***ARG仅在构建Docker映像(RUN等)期间可用,在创建映像并从映像启动容器(ENTRYPOINT、CMD)后不可用。
ENV值可用于容器,但也可用于Docker构建期间从引入它们的行开始的RUN样式命令。如果您使用bash(RUN export VARI=5 &&...)在中间容器中设置环境变量,它将不会在下一个命令中持久化。
*2)更详细的解释:****ARG也称为构建时变量。它们仅在使用ARG指令在Dockerfile中“宣布”时可用,直到构建映像时为止。运行容器不能访问ARG变量的值。这也适用于CMD和ENTRYPOINT指令,这些指令只是告诉容器默认情况下应该运行什么。如果您告诉Dockerfile需要各种ARG变量(没有默认值),但在运行构建命令时没有提供任何变量,则会出现错误消息。

然而,ARG值可以很容易地检查后,一个形象是建立,通过查看docker历史的形象。因此,他们是一个糟糕的选择敏感的数据。

ENV变量也可以在构建过程中使用,只要你用ENV指令引入它们。但是,与ARG不同,它们也可以被从最终映像开始的容器访问。ENV值可以在启动容器时被覆盖,下面会详细介绍。
***3)使用diagrem:***以下是围绕从Dockerfile构建Docker映像和运行容器的过程的ARG和ENV可用性的简化概述。

它们重叠,但是ARG不能从容器内部使用。

设置ARG和ENV值

设置ARG值

现在你有了Dockerfile,它定义了ARGENV的值。如何设置它们,在哪里设置?你可以在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运行该命令,将打印以下行(以及其他行):* 哦,该死的,看那价值 *
那么,这如何转化为使用docker-compose.yml文件呢?
当使用docker-compose时,您可以在args块中为ARG指定要传递的值:
(停靠-编写.yml文件)

version: '3'

services:
  somename:
    build:
      context: ./app
      dockerfile: Dockerfile
      args:
        some_variable_name: a_value

当您尝试设置一个不是Dockerfile中提到的ARG的变量时,Docker将发出抱怨。

设置ENV值

那么,如何设置ENV的值呢?你可以在启动你的容器时设置(我们将在下面介绍),但是你也可以通过硬编码直接在你的Dockerfile中提供默认的ENV值。你还可以为环境变量设置动态默认值!
构建映像时,您只能提供ARG值,如上所述。您不能直接为ENV变量提供值。但是,ARGENV可以一起使用。您可以使用ARG设置ENV变量的默认值。
下面是一个基本的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的代码片段,使用动态的构建时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!

构建映像后,可以通过三种不同的方式启动容器并为ENV变量提供值,从命令行或使用docker-compose.yml文件。
所有这些都将覆盖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访问主机环境中的当前值,并将其传递给容器。

$ docker run -e env_var_name alpine env

对于docker-compose.yml文件,为了获得相同的效果,请省略等式符号及其后面的所有内容。

version: '3'

services:
  plex:
    image: linuxserver/plex
      environment:
        - env_var_name

选项3:从文件(env_file)取值

我们可以指定一个从中读取值的文件,而不是写出变量或对它们进行硬编码(根据12因子分析者的观点,这不是一个好方法),这样一个文件的内容如下所示:

env_var_name=another_value

上面的文件名为env_file_name(名称任意),位于当前目录中。
您可以引用文件名,解析该文件名以提取要设置的环境变量:

$ docker run --env-file=env_file_name alpine env

对于docker-compose.yml文件,我们只引用一个env_file,Docker解析它以设置变量。

version: '3'

services:
  plex:
    image: linuxserver/plex
    env_file: env_file_name

从命令行设置ARG和ENV的常用方法

下面是一个小备忘单,结合了ARGENV可用性的概述以及从命令行设置它们的常用方法。

相关问题