我试图在构建过程中设置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
不存在
2条答案
按热度按时间vu8f3i0k1#
ARG
用于设置docker build
过程中使用的环境变量-它们不存在于最终映像中,这就是为什么在使用docker run
时看不到它们。您可以使用
ARG
来设置仅在构建映像时相关的设置,并且从映像运行的容器不需要这些设置。您可以使用ENV
来设置在构建期间和容器中使用的环境变量。使用此停靠文件:
你可以像在
docker build -t temp --build-arg BUILD_TIME=def .
中那样覆盖构建参数,然后得到你所期望的结果: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
,它定义了ARG
和ENV
的值。如何设置它们,在哪里设置?你可以在Dockerfile
中将它们留空,或者设置默认值。如果你没有为没有默认值的ARG变量提供值,你会得到一个错误消息。下面是一个
Dockerfile
示例,包括使用默认值和不使用默认值的情况:从命令行构建Docker映像时,可以使用
–build-arg
设置ARG
值:使用上面的
Dockerfile
运行该命令,将打印以下行(以及其他行):* 哦,该死的,看那价值 *那么,这如何转化为使用
docker-compose.yml
文件呢?当使用docker-compose时,您可以在args块中为
ARG
指定要传递的值:(停靠-编写.yml文件)
当您尝试设置一个不是
Dockerfile
中提到的ARG
的变量时,Docker将发出抱怨。设置ENV值
那么,如何设置
ENV
的值呢?你可以在启动你的容器时设置(我们将在下面介绍),但是你也可以通过硬编码直接在你的Dockerfile
中提供默认的ENV
值。你还可以为环境变量设置动态默认值!构建映像时,您只能提供
ARG
值,如上所述。您不能直接为ENV
变量提供值。但是,ARG
和ENV
可以一起使用。您可以使用ARG设置ENV
变量的默认值。下面是一个基本的
Dockerfile
,使用硬编码的默认值:下面是一个
Dockerfile
的代码片段,使用动态的构建时env值:构建映像后,可以通过三种不同的方式启动容器并为
ENV
变量提供值,从命令行或使用docker-compose.yml
文件。所有这些都将覆盖
Dockerfile
中的任何默认ENV
值。与
ARG
不同,你可以将所有类型的环境变量传递给容器,甚至是那些没有在Dockerfile
中显式定义的变量。然而,这取决于您的应用程序是否会起作用。
选项1:逐个提供值
在命令行中,使用-e标志:
从
docker-compose.yml
文件:选项2:从主机传递环境变量值
这与上述方法相同。
唯一的区别是,你不提供一个值,而只是命名变量。这将使Docker访问主机环境中的当前值,并将其传递给容器。
对于
docker-compose.yml
文件,为了获得相同的效果,请省略等式符号及其后面的所有内容。选项3:从文件(env_file)取值
我们可以指定一个从中读取值的文件,而不是写出变量或对它们进行硬编码(根据12因子分析者的观点,这不是一个好方法),这样一个文件的内容如下所示:
上面的文件名为env_file_name(名称任意),位于当前目录中。
您可以引用文件名,解析该文件名以提取要设置的环境变量:
对于
docker-compose.yml
文件,我们只引用一个env_file,Docker解析它以设置变量。从命令行设置ARG和ENV的常用方法
下面是一个小备忘单,结合了
ARG
和ENV
可用性的概述以及从命令行设置它们的常用方法。