43

具有以下 docker-compose 文件:

db:
    build: .
    environment:
        - MYSQL_ROOT_PASSWORD=password
        - ENV=test
    env_file: .env

有没有办法使用 docker-compose.yml 中声明的环境变量(作为环境或在 env_file 中声明)作为 Dockerfile 的一部分,而不在 Dockerfile 中声明它们?像这样的东西:

FROM java:7
ADD ${ENV}/data.xml /data/
CMD ["run.sh"]
4

3 回答 3

38

虽然很久以前就问过这个问题,但这里有一个类似问题的答案:Pass environment variables from docker-compose to container at build stage

基本上,要在容器的构建时使用变量,必须在以下位置定义变量docker-compose.yml

build:
  context: .
  args:
    MYSQL_ROOT_PASSWORD: password
    ENV: test

然后在Dockerfileusing中引用它ARG

ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/

关于文件中定义的环境变量*.env,我相信它们不能在构建时传递给容器。

于 2017-01-25T09:36:29.350 回答
23

这样可以正常工作:

码头工人-compose.yml

version: '3.5'

services:
    container:
        build:
            context: .
            args:
                ENV: ${ENV} # from .env file
        env_file:
            - .env

Dockerfile

# from compose args
ARG ENV 
ADD ${ENV}/data.xml /data/

.env

ENV=myenv

因此所有的值都取自 .env 文件

于 2019-04-24T22:12:41.850 回答
13

这种方法违背了 Docker 和大多数 DevOps 方法背后的“构建一次,随处运行”的理论。使用这种方法,您需要为您希望使用的每个环境构建一个容器。通过这样做,您不能安全地说容器是否在开发环境中工作,因为您使用的不是同一个容器,所以它将在登台和生产环境中工作。

您最好将所需的所有配置文件添加到容器中,并编写一个入口点脚本,在容器启动时选择/复制该环境的数据到正确的位置。您还可以将此方法应用于容器上的其他配置,例如使用 jinja2 模板的模板化 Apache 配置等。

于 2016-02-05T11:41:39.760 回答