【问题标题】:Use docker-compose env variable in Dockerbuild file在 Dockerbuild 文件中使用 docker-compose 环境变量
【发布时间】:2015-05-29 11:40:44
【问题描述】:

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

【问题讨论】:

标签: docker docker-compose


【解决方案1】:

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

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

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

然后使用ARGDockerfile中引用它:

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

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

【讨论】:

  • 谢谢!这正是我想要的。
  • 这些args是否可以在env_file: .env中定义而不是docker-compose并以与上述类似的方式在Dockefile中被识别?
  • @JavaSa Googd 问题,因为与官方文档相反,它在我的情况下不起作用。
【解决方案2】:

这样可以正常工作:

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

【讨论】:

  • 如果.env中不存在,我们如何设置默认变量?有可能吗?
  • 你可以在 docker-compose.yml 中这样操作:ENV: ${ENV:-default_value}
【解决方案3】:

这种方法与 Docker 和大多数 DevOps 方法背后的“构建一次,随处运行”理论背道而驰。使用这种方法,您需要为您希望使用的每个环境构建一个容器。通过这样做,您无法确定容器是否可以在开发环境中工作,因为您使用的不是同一个容器。

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

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2015-06-17
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多