【问题标题】:docker-compose passing environment variables into container possible?docker-compose 可以将环境变量传递到容器中吗?
【发布时间】:2020-12-17 22:08:37
【问题描述】:

docker 确实让我很困惑.... 我正在尝试使用“环境”变量以及 .env 文件将变量传递到将要创建的容器中。可惜没有成功。

我的设置是什么:

docker-compose.yml

# dockerfile version 3.8 -> 18.07.2020
version: "3.8"

# services basicly means scalable amount of containers
services:

    testalpine:
        image: testenvalpine
        build:
            context: .
            dockerfile: test-dockerfile
            args:
                - DB_NAME=nextcloud
                - DB_USER=nextcloud
        # todo only use https and self sign certificate
        ports:
            - "80:80"
        environment:
            - env1=hello
            - env2=world
        networks:
            - nextcloudnetwork
        # todo include redis and mariadb 
networks:
    nextcloudnetwork:
        # std driver seems to be overlay?
        driver: overlay

Docker 文件: 测试dockerfile

FROM alpine:latest
LABEL maintainer="xddq <donthavemyownemailyet:(((>"

ARG DB_NAME=default
ARG DB_USER=default

ENV env1=dockerfile env2=$DB_NAME

ENTRYPOINT [ "sh", "-c", \
    "echo DB_NAME: $DB_NAME DB_USER: $DB_USER env1: $env1 env2: $env2" ]

我的 .env 文件

DB_NAME=nextcloud
DB_USER=nextcloud

我预期的输出:

DB_NAME:nextcloud DB_USER: nextcloud env1: hello env2:nextcloud 

我得到的输出:

DB_NAME: DB_USER: env1: dockerfile env2: nextcloud

这是否意味着 docker-compose 中的“.env”和 ENV 变量对于将要创建的容器内的 env 变量完全没有用处?我的意思是我只能使用 ARG 变量得到任何结果..? :/

问候

【问题讨论】:

  • 我认为您的困惑在于ARG 并假设它在运行时填充环境。 ARG 仅在构建时填充环境变量,并用于在构建映像时将变量传递给容器步骤。 .env 文件只会覆盖容器中的 ENV 或撰写文件中的 environment 映射。
  • 嗯,这不是关于 ARG,而是更多关于 ENV。当我在 .env 文件中传递值时,我仍然必须将 key:ARG value:ENV 传递给 dockerfile,以便稍后在我的容器中访问 env 变量。这很令人困惑。我认为无论我在做什么,在 docker-compose 中设置的 ENV 变量都可以在我完成的容器中使用。但是 docker-compose 中的 ENV 变量似乎只能在 docker-compose 中使用。
  • 他们可以。但在您的示例中,您期望的输出取决于 DB_NAMEDB_USER,它们是构建时间 ARG,并且在运行时始终为空白。

标签: docker docker-compose environment-variables arguments devops


【解决方案1】:

.env 不会自动传递给容器,您需要在 docker-compose.yml 中使用 env_file: Explaination here 声明它。 dockerfile 中的环境应该被 docker-compose 文件中的环境覆盖,不知道为什么不是这样。

【讨论】:

  • 哇哦。他们真的在 .env 和 env_file 之间有所作为吗? :D 我稍后会检查,如果可行,会给你最好的答案。我做了一个解决方法,将 ARGS 分配给构建,并将 .env 变量的值传递给 docker-compose。这感觉非常愚蠢。
猜你喜欢
  • 2020-02-23
  • 2017-09-18
  • 2020-11-07
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
相关资源
最近更新 更多