github linkedin instagram email
Golang Docker Image Resize
Jul 27, 2019
3 minutes read

Golang Docker Image Resize

Golang dan docker adalah paduan yang ciamik ketika kita membuat aplikasi microservice yang berjalan di server / cloud. Mengingat kembali artikel ini Docker For Dummy. Lalu muncul pertanyaan, mengapa file aplikasi yang hanya 8-an MB dikonversi ke docker menjadi 900-an MB?

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dockerinaja         latest              78de7207aa5a        3 minutes ago       952MB
golang              1.11.1              45e48f60e268        2 minutes ago       777MB

Tentu saja ini berpengaruh pada saat melakukan docker push, docker pull, dan menghabiskan banyak space di harddisk. Lalu saya mulai cari artikel bagaimana caranya meresize docker images supaya dapat diresize seminimal mungkin. Saya menemukan artikel yang pas dari mas Huseyin BABAL Micro Docker Images for Go Applications. Di sana saya menemukan 2 cara yakni menggunakan golang alpine dan build from scratch.

Cara 1 : Golang Alpine

Docker Alpine images adalah images dengan dependensi minimal yang berarti kita tidak akan mendapat banyak tools di dalamnya ketika kita menjalankan aplikasi golang ini. Untuk kasus-kasus umum, biasanya kita tidak membutuhkan images alpine ini. Berikut adalah code main.go saya :

Source Dode

Dan berikut adalah isi Dockerfile saya :

FROM golang:alpine

MAINTAINER Indra Octama omyank2007i@gmail.com

ADD . /go/src/dockerinaja

ARG appname=dockerinaja
ARG http_port=1323

RUN apk update && apk add git

RUN go get -d github.com/go-sql-driver/mysql
RUN go get -d github.com/labstack/echo
RUN go install dockerinaja

ENTRYPOINT /go/bin/dockerinaja

ENV PORT $http_port
ENV DB_HOST yourhost
ENV DB_PORT 3306
ENV DB_USER yourusername
ENV DB_PASS yourpassword

EXPOSE $http_port

RUN mkdir -p /go/src/dockerinaja
COPY . /go/src/dockerinaja
WORKDIR /go/src/dockerinaja

CMD go run main.go

Lalu mulai kita jalankan script berikut ini :

docker build -t dockerinaja .

Seteleh selesai maka kita bisa melihat hasil docker imagesnya :

docker images

Hasil Alpine Di sini kita mendapatkan bahwa size images yang tadinya 900-an MB menjadi 511MB , sehingga berkurang sekitar 400MB. Tapi menurut saya ini masih terlalu besar untuk ukuran aplikasi Go yang sesederhana itu.

Cara 2 : Build From Scratch

Supaya images yang dihasilkan lebih kecil, menurut artikel tersebut adalah melakukannya dengan teknik build from scratch (bikin dari 0). Hal tersebut mereduce semua file yang tidak digunakan oleh aplikasi golang yang kita build. Kita dapat mengakalinya dengan cara mem-build binary file golangnya terlebih dahulu yakni dengan cara seperti ini :

CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

Di sini dengan CGO_ENABLED = 0 dikatakan bahwa menonaktifkan cgo dan membangun aplikasi golang secara statis yang berarti kita akan memiliki semua dependensi begitu kita menyalin biner ini ke images. -a adalah untuk membangun kembali seluruh paket untuk memastikan kita memiliki semua dependensi. Setelah eksekusi ini, kita akan memiliki biner di dalam folder proyek kita. File binary

Berikut ini adalah file Dockerfile nya

FROM scratch

MAINTAINER Indra Octama omyank2007i@gmail.com

ADD main ./

ARG appname=dockerinaja
ARG http_port=1323

ENTRYPOINT ["/main"]

ENV PORT $http_port
ENV DB_HOST yourhost
ENV DB_PORT 3306
ENV DB_USER yourusername
ENV DB_PASS yourpassword

EXPOSE $http_port

Kita ulangi lagi script berikut :

docker build -t dockerinaja .

Berikut ini hasil build images golang dari scratch : Scratch

Wow dari 900-an MB menjadi 8.89 MB saja. Demikian artikel yang saya share semoga bermanfaat :)



Back to posts


comments powered by Disqus