总而言之,我的项目包括:
所以在主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
),那么构建过程的其余部分就可以了,前端应用程序将会拿起这些价值观。
答案 0 :(得分:1)
正如您已经指出的那样,问题是docker compose中的environment / env_file声明应用于RUN,但不是build。要将参数从via docker-compose传递到docker build,您必须在Dockerfile中指定ARGS,如文档here所示。然后,您可以从撰写文件中传递预定义的args,如图here所示。
但是,我认为这种方法引入了太多的耦合和重复声明。我更倾向于将环境定义分离到单独的文件中。
除了已有的内容之外,您只需要为各自的容器定义一个入口点shell脚本,这些容器能够使用环境变量,并在应用程序启动之前生成角度环境绑定environment.prod.ts
。 p>