代码之家  ›  专栏  ›  技术社区  ›  Tora Tora Tora

Angular 6+Nginx+Docker+Kubernetes:如何为不同环境配置环境变量

  •  2
  • Tora Tora Tora  · 技术社区  · 6 年前

    我有一个Angular6应用程序,需要作为Docker容器(Nginx Base Image)部署到Kubernetes集群上。

    问题 :如何使用一次构建的Docker映像进行调整,但能够在dev&prod中运行并指向不同的API URL?

    我的 环境文件 :

    环境.ts

    export const environment = {
      production: false,
      API_URL: 'https://dev-server.domain.com'
    };
    

    环境产品

    export const environment = {
      production: true,
      API_URL: 'https://prod-server.domain.com'
    };
    

    我的 nginx.conf格式

    worker_processes 1;
    
    events {
        worker_connections 1024;
    }
    
    http {
        server {
            listen 80;
            server_name localhost;
    
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            include /etc/nginx/mime.types;
    
            gzip on;
            gzip_min_length 1000;
            gzip_proxied expired no-cache no-store private auth;
            gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
            location / {
                try_files $uri $uri/ /index.html;
            }
        }
    }
    

    我的 停靠文件 :

    # base image
    FROM nginx:alpine
    
    # private and public mapping
    EXPOSE 80
    
    COPY nginx.conf /etc/nginx/nginx.conf
    
    WORKDIR /usr/share/nginx/html
    COPY dist/my_project .
    

    在这一点上,我在本地机器上构建我的项目并优化它以用于生产:

    ng build --prod --build-optimizer
    

    因此,此时我的文件结构如下所示:

    root
        |--Dockerfile
        |--nginx.conf
        |--angular.json
        |--dist
           |--my_project
              |--styles.3ed0e5393a1386f6fc48.css
              |--runtime.a66f828dca56eeb90e02.js
              |--polyfills.2f5aa8fb3d2aea854d83.js
              |--main.2b3e9b16d82428586ae5.js
              |--index.html
              |--favicon.ico
              |--3rdpartylicenses.txt
              |--assets
    

    现在,我准备创建docker图像:

    docker build -t my_application_image .
    

    然后,我将图像推送到Docker注册表,然后在Kubernetes中使用。

    既然您知道我的设置,您能建议我如何修改它,以便不同的环境文件可以用于dev&prod吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Radek 'Goblin' Pieczonka    6 年前

    解决这个问题的方法之一就是在docker映像中添加一个entrypoint脚本和一个默认的prod env。只使用一个环境。ts,例如:

    export const environment = {
      production: {{production}},
      API_URL: '{{api_url}}'
    };
    

    停靠文件

    ENV PRODUCTION=true API_URL=https://prod-server.domain.com
    ADD entrypoint.sh /entrypoint.sh
    ENTRYPOINT /entrypoint.sh
    

    最后自己进入

    #!/bin/bash
    sed -i "s/{{production}}/${PRODUCTION}/g" environment.ts
    sed -i "s/{{api_url}}/${API_URL}/g" environment.ts
    exec $@
    
    推荐文章