Angular Deploy to Docker
Konfigurasi Docker Image
Buat sebuah file baru di root folder projek angular dengan nama Dockferfile
dan buat satu folder baru dengan nama nginx
dan kemudian bikin satu file di folder nginx
(yang baru saja dibuat) dengan nama nginx.conf
.
Buka file Dockerfile
kemudian tuliskan
### Tahap 1 ###
FROM node:16.10-alpine AS build
WORKDIR /dist/src/app
RUN npm cache clean --force
COPY . .
RUN npm install
RUN npm run build
### Tahap 2 ###
FROM nginx:latest AS ngi
COPY --from=build /dist/src/app/dist/<nama-projek> /usr/share/nginx/html
COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
Note: sesuaikan dengan nama projek angular
Pada Tahap 1 kita akan mengambil image node:16.10-alpine
dan menjadikannya sebagai dasar dari image kita, image ini akan secara default terinstall Nodejs
versi 16, kemudian kita jadikan folder /dist/src/app
sebagai folder untuk kita menempatkan projek angular kita yang akan dideploy. Baris RUN npm cache clean --force
sebenarnya opsional perintah itu akan membersihkan cache dari npm.
Selanjutnya, baris COPY . .
akan menyalin semua file dan folder dari projek angular kita ke dalam folder /dist/src/app
didalam image docker kita. Terakhir, kita jalan perintah npm install
untuk menginstall depedencies dari projek angular kita dan perintah npm run build
untuk membuild projek angular kita.
Sebelum ke Tahap 2 buka file nginx.conf
yang sudah dibuat sebelumnya. Disini kita akan menuliskan konfigurasi untuk bagaimana nginx
seharusnya menangani projek angular kita
server {
listen 80;
sendfile on;
default_type application/octet-stream;
gzip on;
gzip_http_version 1.1;
gzip_disable "MSIE [1-6]\.";
gzip_min_length 256;
gzip_vary on;
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;
gzip_comp_level 9;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.html;
}
}
Pada Tahap 2 kita mulai dengan mengambil image docker nginx, kemudian menyalin hasil build projek angular kita yang sudah dilakukan pada Tahap 1 kedalam root html nginx. Kemudian kita akan menggantikan konfigurasi default nginx dengan konfigurasi yang sudah kita siapkan sebelumnya. Terkahir kita bisa mengexpose port 80 dimana nginx berada.
Membuat dan Menjalankan Docker Image
Untuk membuat imagenya kita bisa menjalankan perintah
docker build -t mydocker/angular:latest .
dan tunggu hingga proses build selesai.
Menjalankannya kita bisa lakukan dengan perintah
docker run docker run -d -t -i -p 4200:80 --name mydocker-angular mydocker/angular:latest
Buka browser dan pergi ke
http://localhost:4200
Jika tidak ada kesalahan selama proses membuat image dan menjalankan seharusnya kita sudah bisa melihat projek angular kita.
Membuat Variabel Enviroment Menjadi Dinamis
Anggaplah kita mau membuat sebuah variabel environment dengan nama ENV_NAME
.
ENV_NAME
merupakan nama variabel environment yang kita gunakan. Kita bisa menambahkan variabel environment apapun seperti api-endpoint, token, secret-key atau pun yang lainnya.
Ubah file src/environment.ts
menjadi
declare const window: any;
export const environment = {
production: false,
name: window["env"]["ENV_NAME"] || "EZZY"
};
Dan file src/environment.prod.ts
menjadi
declare const window: any;
export const environment = {
production: true,
name: window["env"]["ENV_NAME"] || "Ezzy"
};
Kemudian buat dua file baru didalam folder src/assets
dengan nama env.js
dan env.template.js
.
File env.js
.
// File: env.js
(function (window) {
window.env = window.env || {};
// Env Variable
window["env"]["ENV_NAME"] = "";
})(this);
Dan file env.template.js
(function (window) {
window.env = window.env || {};
// Env Variable
window["env"]["ENV_NAME"] ="${ENV_NAME}";
})(this);
Selanjutnya, ubah masukkan file env.js
kedalam file src/index.html
<script src="assets/env.js"></script>
Terakhir tambahkan baris
CMD ["/bin/sh", "-c", "envsubst < /usr/share/nginx/html/assets/env.template.js > /usr/share/nginx/html/assets/env.js && exec nginx -g 'daemon off;'"]