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

时间:2018-09-14 05:39:39

标签: docker nginx kubernetes angular6

我有一个Angular 6应用程序,需要将它作为Docker容器(Nginx基本映像)部署到Kubernetes集群上。

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

我的环境文件

environment.ts

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

environment.prod.ts

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;
        }
    }
}

我的 Dockerfile

# 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中使用。

现在您知道我的设置了,您能建议我如何修改它,以便可以将不同的环境文件用于开发和生产吗?

1 个答案:

答案 0 :(得分:1)

解决该问题的方法之一是在您的Docker映像中添加一个入口点脚本和默认的prod env。仅使用一种环境:

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

Dockerfile与

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 $@