当前位置: 首页 > 知识库问答 >
问题:

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

柴昆杰
2023-03-14

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

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不在场

共有2个答案

梁丘诚
2023-03-14

我将总结这篇伟大文章的亮点。

1)简短解释:
ARG仅在Docker映像构建期间(RUN等)可用,而不是在创建映像并从中启动容器之后(ENTRYPOINT,CMD)。

ENV值可用于容器,但也可用于Docker构建过程中的RUN样式命令(从引入它们的行开始)。如果使用bash在中间容器中设置环境变量(RUNexportVARI=5

2)更长的解释:
ARG也称为构建时间变量。它们只在Dockerfile中使用ARG指令“宣布”的那一刻起,直到构建图像时才可用。正在运行的容器无法访问ARG变量的值。这也适用于CMD和ENTRYPOINT指令,它们只告诉默认情况下容器应该运行什么。如果您告诉Dockerfile需要各种ARG变量(没有默认值),但在运行build命令时没有提供任何变量,则会出现错误html" target="_blank">消息。

然而,ARG值可以在构建映像后通过查看映像的docker历史记录轻松检查。因此,对于敏感数据来说,它们是一个糟糕的选择。

在构建过程中,只要您使用ENV指令引入ENV变量,就可以使用ENV变量。然而,与ARG不同,它们也可以由从最终图像开始的容器访问。启动容器时可以重写ENV值,下面将详细介绍。

3)使用diagrem:
这里是ARG和ENV可用性的简化概述,围绕从Dockerfile构建Docker映像和运行容器的过程。

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

因此,您有您的Dockerfile,它定义ARGENV值。如何设置它们,以及在哪里设置?您可以在Dockerfile中将它们留空,或者设置默认值。如果您没有为没有默认值的预期ARG变量提供值,您将收到错误消息。

下面是一个<code>Dockerfile</code>示例,包括默认值和不使用默认值:

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_value

那么,这如何转化为使用< code>docker-compose.yml文件呢?< br >使用docker-compose时,可以在args块中为< code>ARG指定要传递的值:< br> (docker-compose.yml文件)

version: '3'

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

当你尝试设置一个 Dockerfile 中没有提到 ARG 的变量时,Docker 会抱怨。

那么,如何设置< code>ENV值呢?您可以在启动您的容器时这样做(我们将在下面讨论这一点),但是您也可以通过硬编码直接在< code>Dockerfile中提供默认的< code>ENV值。此外,您可以为环境变量设置动态默认值!

在构建图像时,您可以提供的唯一内容是ARG值,如上所述。不能直接为ENV变量提供值。然而,ARGENV都可以一起工作。您可以使用ARG设置ENVvars的默认值
这里有一个基本的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

下面是< code>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 变量提供值。
所有这些都将覆盖 Docker 文件中的任何默认 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)中取值< br >我们可以指定一个文件来从中读取值,而不是写出变量或对它们进行硬编码(根据12因素的说法,这不是一个好主意)。此类文件的内容如下所示:

env_var_name=another_value

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

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

使用<code>docker compose。yml文件,我们只引用一个env_file,Docker解析它以设置变量。

version: '3'

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

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

隗锐进
2023-03-14

< code>ARG用于设置在< code>docker构建过程中使用的环境变量,它们不会出现在最终的映像中,这就是为什么当您使用< code>docker run时看不到它们。

您可以使用ARG进行设置,这些设置仅在构建映像时才相关,而从映像运行的容器不需要这些设置。您可以使用ENV作为环境变量,以便在构建期间和容器中使用。

使用此Dockerfile:

FROM ubuntu                                                                                                            
ARG BUILD_TIME=abc                                                                                                     
ENV RUN_TIME=123                                                                                                       
RUN touch /env.txt                                                                                                     
RUN printenv > /env.txt 

您可以重写构建arg,就像您使用docker构建-t temp--Build-argBUILD_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=/ 
 类似资料:
  • 问题内容: 我正在尝试在构建期间在Docker容器中设置环境变量,但没有成功。使用run命令设置它们可以工作,但是我需要在构建期间进行设置。 Docker文件 我正在使用的命令 跑步 我正在通过检查可用的环境变量 结果是 TEST_ENV不存在 问题答案: 用于设置在过程中使用的环境变量-它们不会出现在最终图像中,这就是为什么在使用时看不到它们的原因。 您使用的设置仅在构建映像时相关,而从映像运行

  • 并且生成失败: 任务“:MyProject:SetEnv”执行失败。 启动进程“command”export“时出现问题 我已经单独测试了它:值确实会被传递,并且我的测试任务接收所有东西,无论是systemProperty、environment变量还是jvmarg。 所以Gradle本身在这里并没有什么问题。 当我在实际项目中尝试时,问题就出现了。它使用Spring进行依赖注入。我可能错了,但看

  • 在Jenkins中,您可以使用类似cron的时间定义将作业设置为周期性构建。 此外,还可以配置参数化作业。这意味着您可以随时设置一些预定义环境变量的值,这些变量将在配置中使用。e、 g.git上的某个分支您可以让用户设置环境变量“branch”的值,然后使用 在配置中。 但这似乎不适用于周期性构建作业配置的值。 我的问题: 我正在使用作业生成器插件。它基本上创建新的(不是参数化的,而是周期性运行的

  • 这个码头商。yml: 使用这个。env文件(它位于根文件夹中,如docker-compose.yml和Dockerfile): 和节点服务器启动中的以下代码: 我真的更喜欢使用第一种或第二种方法 docker版本:18.06.1-CE docker-compose版本:1.19.0

  • 问题内容: 我需要在python脚本中设置一些环境变量,并且我希望从python调用的所有其他脚本(shell脚本)(将是子进程)来查看设置的环境变量。该值为数字。 如果这样做,它会抱怨说1必须是字符串。我也想知道一旦设置它,如何在python(在脚本的后半部分)中读取环境变量。 问题答案: 你可能需要考虑其他方面的代码健壮性; 当你将整数值的变量存储为环境变量时,请尝试 然后为了进行检索,请考虑

  • 问题内容: 如何从内部设置一些环境变量以与类似命令一起使用? 这是我目前所拥有的: 我想在启动脚本中设置环境变量(例如),同时仍然能够仅通过一个命令来启动应用程序。 问题答案: 在脚本命令中设置环境变量: 然后在您的应用中使用。 注意:确保它可以跨平台工作。如果只关心Mac / Linux,则可以忽略它。