Compose: 环境变量不适用于容器构建

创建于 2015-08-10  ·  16评论  ·  资料来源: docker/compose

在构建容器时,不应用环境变量。

docker-compose.yml:

img:
    build: img
    environment:
        VAR: Hello

/ img / Dockerfile:

FROM python:2.7
RUN python -c 'import os; print os.environ["VAR"]'

预期写有“ Hello”,收到KeyError: VAR -缺少环境变量。

如果您使用docker-compose run --rm img bash进入容器(在删除最后一条失败的行之后)并执行python -c 'import os; print os.environ["VAR"]' ,则将获得预期的结果。

docker-compose==1.3.3

docker-version

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
kinquestion

最有用的评论

这个堆栈溢出问题的答案有助于https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

可以将.env环境变量映射到ARGS,以便在构建期间由Dockerfile使用。

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

所有16条评论

这是预期的。 docker-compose.ymlenvironment:键与在docker run命令中启动容器所指定的键相同。 builddockerfile是用于生成图像的旧键。

从文档中可能看不出来,可以进行改进。

Docker不支持将环境注入到构建环境中(它必须是Dockerfile的一部分),但我相信有一些开放的建议来添加对类似内容的支持。

仅仅是发现此问题的任何人的参考,这里是有关构建时变量的docker讨论: https : https :

这让我们很难接受,确实需要更好的文档。

该文档确实令人困惑,例如,谈论env文件,该文件用于docker-compose.yml ,而用于docker run 。 鉴于docker-compose是用于构建和运行容器的编排工具,可以很容易地假设使用--env <key>=<value>类的环境将环境应用于构建时间。

也咬我
仅需说明,可以在compose文件中将环境变量设置为build args。 像该线程上的其他线程一样,我最初希望env_file或环境可同时用于构建和运行。
已通过撰写文件v2,docker-compose v1.7和docker-engine v1.11验证。

请注意,如果您需要从文件中包含环境变量,则可以执行以下操作。 这将需要(在docker-compose build部分中)从这些变量设置的args,然后可以在docker文件中引用它们。 这意味着虽然您不能直接重用env_file,但可以做一些额外的工作。

env $(cat vars.env | xargs) docker-compose up --build <whatever>

这个堆栈溢出问题的答案有助于https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

可以将.env环境变量映射到ARGS,以便在构建期间由Dockerfile使用。

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

@williamli您可以向“堆栈溢出”问题添加链接吗?

抱歉,我不确定我是否知道该如何解决-我想使用一个预先构建的图像。

例如,我的撰写文件是:

版本:“ 3”

服务:
web1:
图片:softwaremaker / web-w
环境:

  • wtmsdemo_customerapi01 = http:// api1 / api / values
    端口:
  • “ 89:80”
    取决于:
  • api1
    api:
    图片:softwaremaker / api-w
    网络:
    默认:
    外部:

名称:nat

我以前认为api映像(softwaremaker / api-w)可以解析为我在上面设置的环境变量,但是它不起作用。

@PatrLind
在我的原始评论中添加了stackoverflow链接。

https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

此问题与除默认.env文件以外的env文件仍然有关。
Fe Next代码不起作用:

  nginx:
    env_file:
      - .env
      - .env.local
    environment:
     - SERVER_NAME=${SERVER_NAME}
    build:
      context: ./nginx
      dockerfile: Dockerfile
      args:
        server_name: ${SERVER_NAME}

而SERVER_NAME是在第二个环境文件( .env.local )中定义的。
我看不到从.env.local传递env var来构建上下文的选项((

@remort
我也可以确认这一点,如果在构建过程中使用了变量,则仅在文件名为.env情况下才将其传递给构建过程,如果将它们命名为.env.docker ,则不会得到它们已接。 即使将env_file指定为使用.env.docker文件。

在构建期间,我的解决方案是将另一个命名的env文件复制并重命名为.env

COPY .env.docker ${APP_HOME}/.env
WORKDIR $APP_HOME

此后,它似乎在容器运行时提取环境变量

作业系统: macOS(10.14.6)
Docker桌面版本: 2.1.0.5(40693)
引擎版本: 19.03.5
撰写: 1.24.1

嗨,大家好,

一个简单的问题要问大家,这是否是为开发人员建立映像的更好方法? 到目前为止,它工作正常。 但是,这是推荐的做法吗? 所有图像均基于破坏者。

```
来自redis:破坏者为redis
运行mkdir / env && env> /env/.env_redis
运行cat / etc / passwd
运行ls -lah / home
来自红宝石:超薄克星AS红宝石
运行mkdir / env && env> /env/.env_ruby

FROM节点:lts-buster-slim AS节点
运行mkdir / env && env> /env/.env_node

构建nginx

FROM nginx:最新AS nginx
运行mkdir / env && env> /env/.env_nginx

建立PHP

来自php:fpm-buster AS php

来自php:7.3.14-fpm-buster AS php

运行mkdir / env && env> /env/.env_php
复制--from = redis //
复制--from =红宝石/ /
复制--from = node //
复制--from = nginx //

添加conf / include-site.conf /etc/nginx/conf.d/include-site.conf
添加conf / supervisord.conf /etc/supervisord.conf

su su root
展览80443
WORKDIR“ / var / www / html”

ENTRYPOINT [“ / bin / bash”,“ /start.sh”]

问题仍然存在。
与通过args将env vars传递到容器构建相比,build区段中的env_file关键字将更加清晰。
像这样:

#NOT_WORKING
build:
      context: ./client
      dockerfile: Dockerfile
      env_file: ${CURRENT_ENV_FILE}

因为我正在使用Shell脚本来构建和构建docker compose。
对于生产,我需要与dev / local不同的env_file。
而且有许多带有许多args的docker-compose.env.yml文件,所以我认为这并不方便

我认为需要采取一些优雅的方法。 我真的很喜欢docker语法,使用参数代替环境变量对我来说没有意义。 我不希望有人手动更改我的docker-compose文件。 更改.env文件中的值似乎与我一致。

此页面是否有帮助?
0 / 5 - 0 等级