Mic*_*zko 38 docker dockerfile
我正在尝试在构建期间在docker容器中设置环境变量但没有成功.使用run命令时设置它们有效但我需要在构建期间设置它们.
Dockerfile
FROM ubuntu:latest
ARG TEST_ENV=something
Run Code Online (Sandbox Code Playgroud)
命令我正在使用构建
docker build -t --build-arg TEST_ENV="test" myimage .
Run Code Online (Sandbox Code Playgroud)
运行
docker run -dit myimage
Run Code Online (Sandbox Code Playgroud)
我正在使用检查可用的环境变量
docker exec containerid printenv
Run Code Online (Sandbox Code Playgroud)
结果是
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
Run Code Online (Sandbox Code Playgroud)
TEST_ENV不存在
Rtm*_*tmY 80
我将总结这篇精彩文章的亮点。
1 ) 简短说明:
ARG仅在构建 Docker 镜像(RUN 等)期间可用,在创建镜像并从中启动容器后(ENTRYPOINT、CMD)不可用。
ENV值可用于容器,但也可用于 Docker 构建期间从引入它们的行开始的 RUN 样式命令。如果您使用 bash (RUN export VARI=5 && ...) 在中间容器中设置环境变量,它将不会在下一个命令中持续存在。
2 ) 更长的解释:
ARG也称为构建时变量。它们仅从使用 ARG 指令在 Dockerfile 中“通知”到构建映像的那一刻可用。正在运行的容器无法访问 ARG 变量的值。这也适用于 CMD 和 ENTRYPOINT 指令,它们只是告诉容器默认应该运行什么。如果您告诉 Dockerfile 期望各种 ARG 变量(没有默认值),但在运行构建命令时没有提供,则会出现错误消息。
但是,通过查看图像的 docker 历史记录,可以在构建图像后轻松检查 ARG 值。因此,它们对于敏感数据来说是一个糟糕的选择。
ENV变量在构建期间也可用,只要您使用 ENV 指令引入它们。但是,与 ARG 不同的是,它们也可由从最终映像启动的容器访问。启动容器时可以覆盖 ENV 值,更多内容见下文。
3 ) 使用图表:
这里是围绕从 Dockerfile 构建 Docker 映像和运行容器的过程中 ARG 和 ENV 可用性的简化概述。
它们重叠,但不能从容器内部使用 ARG。
所以,你有你的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}
Run Code Online (Sandbox Code Playgroud)
从命令行构建 Docker 映像时,您可以ARG使用–build-arg以下方法设置值:
$ docker build --build-arg some_variable_name=a_value
Run Code Online (Sandbox Code Playgroud)
使用上面的运行该命令Dockerfile将导致打印以下行(以及其他):Oh dang 看看那个 a_value
那么,这如何转化为使用docker-compose.yml文件呢?
使用 docker-compose 时,您可以ARG在 args 块中指定要传递的值:
(docker-compose.yml 文件)
version: '3'
services:
somename:
build:
context: ./app
dockerfile: Dockerfile
args:
some_variable_name: a_value
Run Code Online (Sandbox Code Playgroud)
当您尝试设置 中未ARG提及的变量时Dockerfile,Docker 会抱怨。
那么,如何设置ENV值呢?您可以在启动容器时执行此操作(我们将在下面查看),但您也可以通过硬编码ENV直接在您Dockerfile的容器中提供默认值。此外,您可以为环境变量设置动态默认值!
构建图像时,您唯一可以提供的是ARG值,如上所述。您不能ENV直接为变量提供值。然而,无论是ARG和ENV可以一起工作。您可以使用 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
Run Code Online (Sandbox Code Playgroud)
这是 a 的片段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!
Run Code Online (Sandbox Code Playgroud)
构建映像后,您可以启动容器并ENV以三种不同的方式为变量提供值,从命令行或使用docker-compose.yml文件。
所有这些都将覆盖任何默认ENV的值Dockerfile。
与 不同ARG,您可以将各种环境变量传递给容器。即使在Dockerfile.
然而,这取决于您的应用程序是否会做任何事情。
选项 1:一一提供值
在命令行中,使用 -e 标志:
$ docker run -e "env_var_name=another_value" alpine env
Run Code Online (Sandbox Code Playgroud)
从docker-compose.yml文件:
version: '3'
services:
plex:
image: linuxserver/plex
environment:
- env_var_name=another_value
Run Code Online (Sandbox Code Playgroud)
选项 2:从您的主机传递环境变量值
与上述方法相同。
唯一的区别是,您不提供值,而只是命名变量。这将使 Docker 访问宿主环境中的当前值并将其传递给容器。
$ docker run -e env_var_name alpine env
Run Code Online (Sandbox Code Playgroud)
对于docker-compose.yml文件,省略等式符号及其后的所有内容以获得相同的效果。
version: '3'
services:
plex:
image: linuxserver/plex
environment:
- env_var_name
Run Code Online (Sandbox Code Playgroud)
选项 3:从文件 (env_file) 中获取值
我们可以指定一个文件来读取值,而不是将变量写出或对其进行硬编码(根据 12 因子人员的说法不太好)。此类文件的内容如下所示:
env_var_name=another_value
Run Code Online (Sandbox Code Playgroud)
上面的文件名为 env_file_name(名称任意),它位于当前目录中。
您可以引用文件名,解析该文件名以提取要设置的环境变量:
$ docker run --env-file=env_file_name alpine env
Run Code Online (Sandbox Code Playgroud)
对于docker-compose.yml文件,我们只引用一个 env_file,Docker 会解析它以设置变量。
version: '3'
services:
plex:
image: linuxserver/plex
env_file: env_file_name
Run Code Online (Sandbox Code Playgroud)
这是一个小备忘单,结合了概述ARG和ENV可用性以及从命令行设置它们的常用方法。
Elt*_*man 65
ARG用于设置在docker build过程中使用的环境变量- 它们不存在于最终图像中,这就是您在使用时看不到它们的原因docker run.
您可以使用ARG仅在构建映像时相关的设置,并且从映像运行的容器不需要这些设置.您可以ENV在构建期间和容器中使用环境变量.
使用此Dockerfile:
FROM ubuntu
ARG BUILD_TIME=abc
ENV RUN_TIME=123
RUN touch /env.txt
RUN printenv > /env.txt
Run Code Online (Sandbox Code Playgroud)
您可以像完成一样覆盖构建arg 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=/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42701 次 |
| 最近记录: |