Angular& Docker:环境感知配置

时间:2017-06-14 15:55:53

标签: angular docker

我们现在正在使用Angular 4建立SPA,并在Azure上使用Docker托管它。通常,如果我们使用Angular-CLI构建命令,则使用Environment-Configs在Angular中设置环境(Prod,Development,Testing)。这很棒,但Docker的工作流程有点不同:

  1. 构建Angular App
  2. 初始化Docker容器
  3. 设置Docker Container环境变量
  4. 启动Docker容器
  5. 这意味着我们有一个计时问题,因为在编译时,我们不能说,应用程序将在哪个环境中运行。对于服务器(.net核心),这没有问题,因为我们可以使用ASPNETCORE_ENVIRONMENT变量,但我们没有找到使App知道环境类型的解决方案。 我几乎可以肯定我们并不是唯一一个遇到这个问题的人,但到目前为止我找不到合适的解决方案。是否有一些我们不知道的可能性?

1 个答案:

答案 0 :(得分:7)

由于我的主要目标是不为每个环境创建一个Container,而是使构建过程与环境无关,所以我提出了以下解决方案: 我正在使用docker-stack文件添加命令(我的Docker映像为NGinx):

command: /bin/bash -c "cp /usr/share/nginx/html/assets/app-settings/appsettings.__EnvironmentName__.json /usr/share/nginx/html/assets/app-settings/appsettings.json && find "/usr/share/nginx/html/assets/app-settings/" -type f -name "*.json" -not -name "appsettings.json" -exec rm {} ';' && exec nginx -g 'daemon off;'"

该命令执行三件事:

  1. 将特定于环境的appsettings.json(请参见下文)复制为 appsettings.json
  2. 删除所有appsettings.xxx.json,除了 appsettings.json
  3. 启动nginx

发布过程还将 EnvironmentName 替换为其部署到的特定环境。这意味着,每个容器现在都具有一个appsettings.json以及特定于环境的数据。 在角度代码上,我仅使用环境文件来获取与编译时环境无关的信息:

export const environment = { production: false };

应用设置另存为资产:

enter image description here

要读取appsettings.json的运行时信息,我使用本地http调用创建了一个appsettings提供程序服务:

@Injectable()
export class AppSettingsProviderService {
  private appSettings: AppSettings;

  public constructor(private http: LocalHttpService) {
  }

  public async provideAppSettingsAsync(): Promise<AppSettings> {
    if (this.appSettings) {
      return Promise.resolve(this.appSettings);
    }

    // This path needs to be relative to the files in the dist-folder
    this.appSettings = await this.http.getAsync<AppSettings>('./assets/app-settings/appsettings.json');
    return this.appSettings;
  }
}

这在开发期间也有效,因为在这种情况下仅使用appsettings.json,即使使用ng serve,代码也将编译为dist,这意味着相对路径仍然正确。