【问题标题】:How to modify the effect of a Dockerfile RUN command based on an environment variable, passed from docker-compose.yml如何根据从 docker-compose.yml 传递的环境变量修改 Dockerfile RUN 命令的效果
【发布时间】:2018-10-16 13:00:53
【问题描述】:

总而言之,我的项目包括:

  • /docker-compose.yml
  • /backend/Dockerfile(“后端”服务的 Docker 文件,一个 Yii2 REST api)
  • /backend/.env(未版本化)
  • /frontend/Dockerfile(“前端”服务的 Docker 文件,一个 Angular2 应用程序)
  • /frontend/.env(未版本化)

因此,在主 docker-compose.yml 中声明了 2 个服务,它们每个都有自己的(非版本化).env 文件,我在其中声明特定于给定服务的“环境特定”参数。例如。对于后端服务,我定义了数据库用户名/密码;对于前端服务,我声明了前端应该通过 Ajax 检索其数据的 REST API URL。

我通过主 docker-compose.yml 使用 env_file 参数将 /backend/.env 传递给后端服务,并将 /frontend/.env 传递给前端服务。

两种服务都托管在不同的域(example.com 和 api.example.com)上。

鉴于 Angular 2 如何处理其配置,您不能声明操作系统级别的环境变量并让 Angular 在运行时在应用程序内使用它们(例如,从 env 变量中读取“BACKEND_URL”并对其进行 Ajax 调用)。相反,它希望在构建过程中所有环境参数都存在于一个名为 /src/app/environment.prod.ts 的文件中。我设法通过 /frontend/Dockerfile 中的 RUN 命令创建了这个配置文件,但我正在努力用未版本化的 /frontend/.env 中声明的动态值填充它。我不想在 /frontend/Dockerfile 中硬编码东西。

一旦 /frontend/Dockerfile 生成具有正确值的静态 /src/app/environment.prod.ts(例如 BACKEND_URL=http://api.example.com),那么构建过程的其余部分就可以了,前端应用程序将开始执行这些值。

【问题讨论】:

    标签: angular docker docker-compose dockerfile


    【解决方案1】:

    正如您已经指出的那样,问题是 docker compose 中的 environment/env_file 声明适用于 RUN,而不是构建。要通过 docker-compose 将参数传递给 docker build,您必须在 Dockerfile 中指定 ARGS,如 here 所述。然后,您可以从 compose 文件中传入预定义的参数,如 here 所示。

    但是,我觉得这种方法引入了太多的耦合和重复声明。我更倾向于您将环境定义分离到单独文件中的方法。

    除了你已有的,你只需要为各个容器定义一个入口点 shell 脚本,它们能够在应用程序启动之前使用环境变量,并生成角度环境绑定environment.prod.ts

    【讨论】:

      猜你喜欢
      • 2018-08-14
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2017-03-18
      • 2017-01-22
      • 1970-01-01
      • 2020-12-07
      • 2021-04-30
      相关资源
      最近更新 更多