将环境变量传递给Angular容器Docker:构建后

时间:2019-06-20 09:29:03

标签: angular docker

最近,我开始致力于Angular App的Docker化。 添加完所有必需的文件(Dockerfile,docker-compose.yml,entrypoint.sh)后,我设法成功构建了映像。

然后,我需要将环境变量传递给应用程序,以传递我不想将其既不添加到代码本身也不添加到Dockerfile的后端api url。

经过一番搜索,我关注了这篇文章

https://codinglatte.com/posts/angular/using-os-environment-variables-in-angular-with-docker/

总结一下

  • 我安装了@ angular-builders / custom-webpack
  • 我将angular.json文件更改为现在使用新的生成器,而不是默认的
  • 我创建了一个custom-webpack.config.js文件,该文件已添加到配置中

    const webpack = require('webpack');
    
    module.exports = {
     plugins: [
       new webpack.DefinePlugin({
        $ENV: {
          ENVIRONMENT: JSON.stringify(process.env.ENVIRONMENT),
          SomeAPIKey: JSON.stringify(process.env.SomeAPIKey),
          SomeOtherAPIKey: JSON.stringify(process.env.SomeOtherAPIKey)
        }
       })
      ]
     };
    
  • 我创建并导出了一个接口,其中包含要导入的变量声明

      import { Env } from 'src/typing';
    
      declare var $ENV: Env;
      export const environment = {
       production: true,
       environment: $ENV.ENVIRONMENT,
       ApiUrl:$ENV.API_URL
    };
    
  • 然后最后一步是将环境变量添加到Dockerfile中,例如

      FROM node:10.15.0 as builder
    
      # SET ENVIRONMENT VARIABLES
      ENV ENVIRONMENT="development"
      ENV API_URL="xxx"
    
      RUN ng build --prod
    

即使我看到

,一切都很好
ENV API_URL=x

命令在

之后
RUN ng build --prod

然后未获取此值。

所以我的问题是我该如何在Dockerfile之外添加不包含此类详细信息的环境变量,并且还应解决ENV命令顺序的问题?

例如,可以在运行时传递这些变量。 例如,Asp.net核心映像可以在以下位置接收环境变量 泊坞窗运行。.

我尝试并发现,如果在构建后传递了这些env变量,则它们不会从angular应用程序接收到。

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

如果API_URLRUN ng build --prod的其他步骤未使用docker build,则无需在Dockerfile中指定它,只需在运行时将其传递给容器即可,如下一个:

docker run --env API_URL="xxx" --env VAR2=value2 ubuntu

您可以参考official guide,则无需关心ENV中的Dockerfile顺序。