我们现在正在使用Angular 4建立SPA,并在Azure上使用Docker托管它。通常,如果我们使用Angular-CLI构建命令,则使用Environment-Configs在Angular中设置环境(Prod,Development,Testing)。这很棒,但Docker的工作流程有点不同:
这意味着我们有一个计时问题,因为在编译时,我们不能说,应用程序将在哪个环境中运行。对于服务器(.net核心),这没有问题,因为我们可以使用ASPNETCORE_ENVIRONMENT变量,但我们没有找到使App知道环境类型的解决方案。 我几乎可以肯定我们并不是唯一一个遇到这个问题的人,但到目前为止我找不到合适的解决方案。是否有一些我们不知道的可能性?
答案 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;'"
该命令执行三件事:
发布过程还将 EnvironmentName 替换为其部署到的特定环境。这意味着,每个容器现在都具有一个appsettings.json以及特定于环境的数据。 在角度代码上,我仅使用环境文件来获取与编译时环境无关的信息:
export const environment = {
production: false
};
应用设置另存为资产:
要读取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,这意味着相对路径仍然正确。