如何根据从docker-compose.yml传递的环境变量修改Dockerfile RUN命令的效果

时间:2018-05-06 16:33:26

标签: angular docker docker-compose dockerfile

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

  • /docker-compose.yml
  • / backend / Dockerfile(“后端”服务的Docker文件,Yii2 REST API)
  • /backend/.env(unversioned)
  • / frontend / Dockerfile(“frontend”服务的Docker文件,Angular2应用程序)
  • /frontend/.env(unversioned)

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

我使用env_file参数通过主docker-compose.yml将/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),那么构建过程的其余部分就可以了,前端应用程序将会拿起这些价值观。

1 个答案:

答案 0 :(得分:1)

正如您已经指出的那样,问题是docker compose中的environment / env_file声明应用于RUN,但不是build。要将参数从via docker-compose传递到docker build,您必须在Dockerfile中指定ARGS,如文档here所示。然后,您可以从撰写文件中传递预定义的args,如图here所示。

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

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