Konfigurasi Docker Nodejs untuk Google Cloud Run

Cloud Run merupakan layanan komputasi serverless berbasis container yang disediakan oleh Google. Ada dua kunci utama dari cloud run yaitu serverless dan container. Serverless berarti kita sebagai pengguna tidak perlu melakukan penyediaan, konfigurasi, dan pengelolaan server. Karena berbasis container, maka kita hanya perlu mengatur environment container tersebut dengan dockerfile. Lalu bagaimana kita melakukan konfigurasi dockerfile nodejs?

Oiya, sebenarnya untuk dockerfile ini bisa berlaku universal di platform manapun. Namun dalam kasus ini saya menggunakan studi kasus di Google Cloud Run. Sehingga untuk beberapa teknis saya sesuaikan dengan dokumentasi dan arahan dari Google Cloud Platform.

Sebelum kita mulai membahas dockerfilenya, kita coba bagi menjadi dua section. Pertama, kita coba gunakan dockerfile yang ada dari dokumentasi original dari Node. Kemudian melakukan adjustment agar sesuai dengan environment GCP.

Server.js

Dengan asumsi kita memiliki entrypoint di script bernama server.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express = require('express');

// Konstanta
const PORT = 8080;
const HOST = '0.0.0.0';

// Webservice
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

Dockerfile Nodejs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM node:16

# Path yang dijadikan direktori utama app ini
WORKDIR /usr/src/app

# Menyalin package.json dan package-lock.json
COPY package*.json ./

RUN npm install
# Melakukan instalasi library yang dibutuhkan
# gunakan line bawah ini untuk versi production
# RUN npm ci --only=production

# menyalin script app
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

Penyesuaian dengan Environment GCR/GCP

Ada dua hal yang perlu diperhatikan dalam melakukan deployment dockerfile di GCR. Pertama, environment variables yang perlu kita cermati karena ada beberapa nama yang sudah digunakan oleh GCP. Kedua, masalah networking terutama port.

Sebaiknya konstanta yang berkaitan dengan port menggunakan environment variable dari GCR dan memberi default value agar tidak bernilai salah ketika environment variablenya tidak diisi. Seperti ini misalnya:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// server.js

const express = require('express');

// Konstanta
const PORT = process.env.PORT || 8080;
const HOST = '0.0.0.0';

// Webservice
const app = express();
app.get('/', (req, res) => {
res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

Deploy ke GCR bisa dilakukan secara interactive dengan gcloud cli:

1
gcloud run deploy

Kita bisa menggunakan Google Cloud Build sehingga hasil imagenya dapat disimpan dan digunakan untuk deploy instance GCR.

1
2
3
4
5
# untuk build
gcloud builds submit --tag asia.gcr.io/PROJECT-ID/IMAGE-NAME:VERSION

# untuk deploy ke GCR
gcloud run deploy --image asia.gcr.io/PROJECT-ID/IMAGE-NAME:VERSION --allow-unauthenticated --region asia-southeast1 NAMA_INSTANCE_GCR

Tips

Pilih node image yang lebih kecil jika merasa hasil imagenya terlalu besar. Misalnya untuk image node:16 menghasilkan 3048 MB.

Sedangkan untuk node:16-alpine menghasilkan 1992 MB.

Demikian untuk konfigurasi dasar untuk dockerfile nodejs. Semoga lain kesempatan akan kita bisa membahas tentang multistage dockerfile untuk nodejs maupun typescript. Saya juga menulis tentang konfigurasi docker untuk bahasa lain seperti php dan tutorial untuk melakukan instalasi font di docker.

Daftar Links

"Dockerizing a Node.js Web App" - https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

"Quickstart: Deploy a Node.js service to Cloud Run" - https://cloud.google.com/run/docs/quickstarts/build-and-deploy/deploy-nodejs-service

"Container run contract" - https://cloud.google.com/run/docs/container-contract


Konfigurasi Docker Nodejs untuk Google Cloud Run
https://reyzeal.com/2023/04/28/Konfigurasi-Docker-Nodejs-untuk-Google-Cloud-Run/
Author
Rey
Posted on
April 28, 2023
Licensed under