我正在为一个红宝石应用程序构建容器.我的应用程序配置包含在环境变量中(使用dotenv加载到应用程序内).
其中一个配置变量是app的公共ip,它在内部用于建立链接.我需要添加一个dnsmasq条目,将此ip指向容器内的127.0.0.1,这样它就可以获取应用程序的链接,就好像它不是容器化的一样.
因此ENV,我试图在我的Dockerfile中设置一个将环境变量传递给容器的文件.
我试了几件事.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
Run Code Online (Sandbox Code Playgroud)
但是,所有内容都传递了"REQUEST_DOMAIN"字符串,而不是环境变量的值.有没有办法将环境变量值从主机传递到容器?
Dan*_*men 363
您应该在Dockerfile中使用该ARG指令,该指令用于此目的.
该
ARG指令定义了一个变量,用户可以使用--build-arg <varname>=<value>标志使用docker build命令在构建时将该变量传递给构建器.
所以你的Dockerfile将有这一行:
ARG request_domain
Run Code Online (Sandbox Code Playgroud)
或者如果您更喜欢默认值:
ARG request_domain=127.0.0.1
Run Code Online (Sandbox Code Playgroud)
现在您可以在Dockerfile中引用此变量:
ENV request_domain=$request_domain
Run Code Online (Sandbox Code Playgroud)
那么你将构建你的容器,如下所示:
$ docker build --build-arg request_domain=mydomain Dockerfile
Run Code Online (Sandbox Code Playgroud)
注意1:如果您ARG在Dockerfile中引用了一个但是将其排除在外,则不会构建您的映像--build-arg.
注意2:如果用户指定了未在Dockerfile中定义的构建参数,则构建会输出警告:
[警告]未使用一个或多个build-args [foo].
Zin*_*fan 68
这适用于那些希望在构建期间使用文件从docker-compose传递 env 变量到dockerfile ,然后将这些参数作为 env 变量传递到容器的人。典型的 docker-compose 文件.env
services:
web:
build:
context: ./api
dockerfile: Dockerfile
args:
- SECRET_KEY=$SECRET_KEY
- DATABASE_URL=$DATABASE_URL
- AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
Run Code Online (Sandbox Code Playgroud)
将文件中存在的 env 变量传递.env给构建命令中的 args。典型.env文件
SECRET_KEY=blahblah
DATABASE_URL=dburl
Run Code Online (Sandbox Code Playgroud)
现在,当您运行 docker-compose up -d 命令时,docker-compose 文件将从 .env 文件中获取值,然后将其传递给 docker-compose 文件。现在,Web 的 Dockerfile 在构建过程中通过 args 包含所有这些变量。现在典型的web dockerfile,
FROM python:3.6-alpine
ARG SECRET_KEY
ARG DATABASE_URL
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
ARG AWS_BUCKET
ARG AWS_REGION
ARG CLOUDFRONT_DOMAIN
ENV CELERY_BROKER_URL redis://redis:6379/0
ENV CELERY_RESULT_BACKEND redis://redis:6379/0
ENV C_FORCE_ROOT true
ENV SECRET_KEY ${SECRET_KEY?secretkeynotset}
ENV DATABASE_URL ${DATABASE_URL?envdberror}
Run Code Online (Sandbox Code Playgroud)
现在我们收到了这些 Secret_key 和 db url 作为 dokcerfile 中的 arg。现在让我们在ENVas中使用它们ENV SECRET_KEY ${SECRET_KEY?secretkeynotset}。现在甚至 docker 容器的环境中也有这些变量。
记住不要使用ARG $SECRET_KEY(我就是这么做的)。它应该是ARG SECRET_KEY
jon*_*sfj 56
所以你可以这样做:
cat Dockerfile | envsubst | docker build -t my-target -
然后有一个Dockerfile,类似于:
ENV MY_ENV_VAR $MY_ENV_VAR
Run Code Online (Sandbox Code Playgroud)
我想一些特殊字符可能存在问题,但这至少适用于大多数情况.
小智 18
使用替代envsubst,而不会失去使用像命令的能力COPY或ADD,并且不使用中间文件是使用bash的进程替换:
docker build -f <(envsubst < Dockerfile) -t my-target .
Run Code Online (Sandbox Code Playgroud)
注意:最初想为jonasfj的答案添加评论,但似乎我没有足够的声誉.
小智 11
从运行时创建的文件加载环境变量.
export MYVAR="my_var_outside"
cat > build/env.sh <<EOF
MYVAR=${MYVAR}
EOF
Run Code Online (Sandbox Code Playgroud)
...然后在Dockerfile中
ADD build /build
RUN /build/test.sh
Run Code Online (Sandbox Code Playgroud)
其中test.sh从env.sh加载MYVAR
#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile
Run Code Online (Sandbox Code Playgroud)
如果您只想查找并替换 Dockerfile 中的所有环境变量 ($ExampleEnvVar),然后构建它,这将起作用:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
当使用build-arg...
\n\n\n
docker build --build-arg CODE_VERSION=1.2 Dockerfile
...考虑到该变量在以下之后不可用FROM:
ARG CODE_VERSION=latest\nFROM base:${CODE_VERSION}\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n
ARG在 a 之前声明的 a位于FROM构建阶段之外,因此它不能在 a 之后的任何指令中使用\xe2\x80\x99FROM。
一般来说,如果不需要,ARG则应将 s 放在以下期间之后:FROMFROM
FROM base:xy\nARG ABC=123\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n
ARG要使用在第一次FROM使用ARG构建阶段内没有值的指令之前声明的默认值:
ARG VERSION=latest\nFROM busybox:$VERSION\nARG VERSION\nRUN echo $VERSION > image_version\nRun Code Online (Sandbox Code Playgroud)\nhttps://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
\n| 归档时间: |
|
| 查看次数: |
193309 次 |
| 最近记录: |