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

时间:2015-03-25 16:55:14

标签: docker docker-compose

拥有以下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"]

3 个答案:

答案 0 :(得分:17)

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

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

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

然后使用Dockerfile

ARG中引用它
ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

这样可以正常工作:

docker-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文件