在Dockerbuild文件中使用docker-compose env变量

问题描述 投票:17回答:3

拥有以下docker-compose文件:

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

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

FROM java:7
ADD ${ENV}/data.xml /data/
CMD ["run.sh"]
docker docker-compose
3个回答
17
投票

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

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

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

然后使用DockerfileARG中引用它:

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

关于*.env文件中定义的环境变量,我认为它们无法在构建时传递给容器。


7
投票

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

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


1
投票

它可以这样工作:

泊坞窗,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文件

© www.soinside.com 2019 - 2024. All rights reserved.