jjzjj

Angular 和 Docker : Environment aware configuration

coder 2023-05-06 原文

我们目前正在使用 Angular 4 设置 SPA,并使用 Azure 上的 Docker 托管它。通常,如果我们使用 Angular-CLI 构建命令,环境(产品、开发、测试)是在 Angular 中使用 Environment-Configs 设置的,这些环境配置会被编译。这很好,但是 Docker 的工作流程有点不同:

  1. 构建 Angular 应用程序
  2. 初始化 Docker 容器
  3. 设置 Docker 容器环境变量
  4. 启动 Docker 容器

这意味着我们有时间问题,因为在编译时,我们不能说应用程序将在哪个环境中运行。对于服务器(.net 核心),这没问题,因为我们可以使用 ASPNETCORE_ENVIRONMENT 变量,但我们没有找到让 App 了解环境类型的解决方案。 我几乎可以肯定我们不是唯一遇到这个问题的人,但到目前为止我还没有找到合适的解决方案。周围是否有一些我们不知道的可能性?

最佳答案

由于我的主要目标不是为每个环境创建一个容器,而是保持构建过程与环境无关,因此我提出了以下解决方案: 我正在使用 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,其中包含特定于环境的数据。 在 Angular 代码上,我将环境文件用于编译时、与环境无关的信息:

导出常量环境 = { 生产:假 };

应用设置保存为 Assets :

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

@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,这意味着相对路径仍然正确。

关于Angular 和 Docker : Environment aware configuration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549480/

有关Angular 和 Docker : Environment aware configuration的更多相关文章

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  2. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  3. ruby-on-rails - Rails with angular 与 Rails pure(查看性能) - 2

    我尝试在Internet上搜索有关使用angularJS进入RubyonRails项目与RubyonRailspure的View性能的信息。我的问题是因为2个月前我开始使用纯AngularJS,现在我需要将AngularJS集成到一个新项目中,但需要展示使用带有RubyonRails的AngularJS呈现View的性能如何,并消除对RubyonRails的负担.例如:带Rails的Angular:使用RubyonRails获取数据(从数据库或GET请求),将信息发送到file.js.erb并使用AngularJS操作数据并显示带有解析数据的View。纯粹的Rails:(自然流程)使用

  4. ruby-on-rails - 将 Angular JS 与 Rails 集成 - 2

    我需要一些指导来了解如何将Angular整合到rails中。选择Rails的原因:我喜欢他们偏执的做事方式。还有迁移,gem真的很酷。使用angular的原因:我正在研究和寻找最适合SPA的框架。Backbone似乎太抽象了。我不得不在Angular和Ember之间做出选择。我首先开始阅读Angular,它对我来说很有意义。所以我从来没有去读过关于ember的文章。使用Angular和Rails的原因:我研究并尝试使用小型框架,例如grape、slim(是的,我也使用php)。但我觉得需要坚持项目的长期范围。我个人喜欢用Rails的方式做事。这就是我需要帮助的地方,我在Rails4中有

  5. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  6. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  7. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  8. 转转测试环境docker化实践 - 2

        测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境    转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境    随着微服务化的进

  9. Docker启动故障问题 no such file or directory解决方法 - 2

    1.现象服务重启后,通过dockerstart方式无法启动实例,报出错误:Errorresponsefromdaemon:errorcreatingoverlaymountto/var/lib/docker/overlay2/xxx/merged:nosuchfileordirectorydockersave导出镜像也报出2.网上各种尝试摸索无效果修改daemon.json中的storage-driver为overlay,重启无效果。禁用selinux,临时或永久方式都无效果。修改/etc/docker/daemon.json中的storage-driver为overlay2,无效果。修改/l

  10. Docker+HomeAssistant+HACS+设备接入教程 - 2

    homeassistant久仰大名,据说可以一统各大物联网平台的设备,家里各平台的设备都有一点,控制起来很不方便,于是乎我也来尝尝~homeassistant官网https://www.home-assistant.io/HACShttps://github.com/hacs/integration准备1.Linux系统(Window)其实也类似2.安装好dockerdocker安装homeassistant官方有几个版本可供选择,安装方式可以:直接刷HA的系统,也可以用Docker安装,还可以直接安装在物理机上,具体区别如下:我采用的是Docker进行安装,也就是Container,从上图也

随机推荐