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

ecy*_*hor 18 docker docker-compose

拥有以下docker-compose文件:

db:
    build: .
    environment:
        - MYSQL_ROOT_PASSWORD=password
        - ENV=test
    env_file: .env
Run Code Online (Sandbox Code Playgroud)

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

FROM java:7
ADD ${ENV}/data.xml /data/
CMD ["run.sh"]
Run Code Online (Sandbox Code Playgroud)

Dan*_*kov 20

它可以这样工作:

docker-compose.yml

version: '3.5'

services:
    container:
        build:
            context: .
            args:
                ENV: ${ENV} # from .env file
        env_file:
            - .env
Run Code Online (Sandbox Code Playgroud)

文件

# from compose args
ARG ENV 
ADD ${ENV}/data.xml /data/
Run Code Online (Sandbox Code Playgroud)

.env

ENV=myenv
Run Code Online (Sandbox Code Playgroud)

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

  • `env_file:` 在这里无关。它的作用是从文件中获取环境变量并将它们注入到容器中,而不是注入到 build 或 docker-compose.yml 中。默认情况下,Docker compose 将尝试加载 ./.env。如果你希望它加载不同的文件,你必须在 docker-compose CMD `docker-compose --env-file my.env up` 中定义它 (3认同)

Bar*_*Naz 17

虽然很久以前就提出了这个问题,但这里有一个类似问题的答案:在构建阶段将docker-compose中的环境变量传递给容器

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

build:
  context: .
  args:
    MYSQL_ROOT_PASSWORD: password
    ENV: test
Run Code Online (Sandbox Code Playgroud)

然后在Dockerfile使用中引用它ARG:

ARG MYSQL_ROOT_PASSWORD
ARG ENV
ADD ${ENV}/data.xml /data/
Run Code Online (Sandbox Code Playgroud)

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

  • 这些“args”可以在“env_file:.env”而不是docker-compose中定义,并以与上面提到的类似的方式在Dockefile中被识别吗? (2认同)

and*_*y88 7

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

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