繁体   English   中英

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

[英]How to modify the effect of a Dockerfile RUN command based on an environment variable, passed from docker-compose.yml

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

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

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

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

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

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

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

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

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

除了已经拥有的内容外,您只需要为各个容器定义一个入口点外壳脚本,这些脚本就可以使用环境变量,并在应用程序启动之前生成角度环境绑定environment.prod.ts

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM