Skip to content

DockerFile

  • Pada kelas Docker Dasar, kita sudah banyak belajar bagaimana cara kerja Docker, dari menggunakan Docker Image, sampai membuat Docker Container
  • Sekarang bagaimana jika kita ingin membuat Docker Image sendiri?
  • Pembuatan Docker Image bisa dilakukan dengan menggunakan instruksi yang kita simpan di dalam file Dockerfile
  • Dockerfile adalah file text yang berisi semua perintah yang bisa kita gunakan untuk membuat sebuah Docker Image
  • Anggap saja semua instruksi untuk, menjalankan aplikasi kita, kita simpan di dalam Dockerfile, nanti Dockerfile tersebut akan dieksekusi sebagai perintah untuk membuat Docker Image

DockerBuild

  • Untuk membuat Docker Image dari Dockerfile, kita bisa menggunakan perintah docker build.
  • Saat membuat Docker Image dengan docker build, nama image secara otomatis akan dibuat random, dan biasanya kita ingin menambahkan nama/tag pada image nya, kita bisa mengubahnya dengan menambahkan perintah -t
docker build -t nama-image:tag folder-dockerfile
docker build -t nginxsaya:v1 . #jika dockerfile berada di current directory

Dockerfile Instruction

  • Secara sederhana berikut adalah format untuk file Dockerfile :

Komentar

INSTRUCTION arguments -#digunakan untuk menambah komentar, kode dalam baris tersebut secara otomatis dianggap komentar INSTRUCTION adalah perintah yang digunakan di Dockerfile, ada banyak perintah yang tersedia, dan penulisan perintahnya case insensitive, sehingga kita bisa gunakan huruf besar atau kecil. Namun rekomendasinya adalah menggunakan UPPPER CASE -Arguments adalah data argument untuk INSTRUCTION, yang menyesuaikan dengan jenis INSTRUCTION yang digunakan

From Instruction

  • Saat kita membuat Docker Image, biasanya perintah pertama adalah melakukan build stage dengan instruksi FROM
  • FROM digunakan untuk membuat build stage dari image yang kita tentukan
  • Biasanya, jarang sekali kita akan membuat Docker Image dari scratch (kosongan), biasanya kita akan membuat Docker Image dari Docker Image lain yang sudah ada

Dockerfile
From alpine:3
- Dalam contoh di atas, kita membuat Docker Image dari Alpine Linux versi 3

Run Instruction

  • RUN adalah sebuah instruksi untuk mengeksekusi perintah di dalam image pada saat build stage.
  • Hasil perintah RUN akan di commit dalam perubahan image tersebut, jadi perintah RUN akan dieksekusi pada saat proses docker build saja, setelah menjadi Docker Image, perintah tersebut tidak akan dijalankan lagi.
  • Jadi ketika kita menjalankan Docker Container dari Image tersebut, maka perintah RUN tidak akan dijalankan lagi.

  • Perintah RUN memiliki 2 format :

  • RUN command
  • RUN [“executable”, “argument”, “...”]
Dockerfile
FROM alpine:3

RUN mkdir hello
RUN echo "Hello World" > "hello/world.txt"
RUN cat "hello/world.txt"

CMD Instruction

  • CMD atau Command, merupakan instruksi yang digunakan ketika Docker Container berjalan
  • CMD tidak akan dijalankan ketika proses build, namun dijalankan ketika Docker Container berjalan
  • Dalam Dockerfile, kita tidak bisa menambah lebih dari satu instruksi CMD, jika kita tambahkan lebih dari satu instruksi CMD, maka yang akan digunakan untuk menjalankan Docker Container adalah instruksi CMD yang terakhir

  • Perintah CMD memiliki beberapa format :

  • CMD command param param
  • CMD [“executable”, “param”, “param”]
  • CMD [“param”, “param”], akan menggunakan executable ENTRY POINT, yang akan dibahas di chapter terpisah
Dockerfile
FROM alpine:3

RUN mkdir hello
RUN echo "Hello World" > "hello/world.txt"

CMD cat "hello/world.txt"

LABEL Instruction

  • Instruksi LABEL merupakan instruksi yang digunakan untuk menambahkan metadata ke dalam Docker Image yang kita buat
  • Metadata adalah informasi tambahan, misal seperti nama aplikasi, pembuat, website, perusahaan, lisensi dan lain-lain
  • Metadata hanya berguna sebagai informasi saja, tidak akan digunakan ketika kita menjalankan Docker Container

  • Berikut adalah format instruksi LABEL

  • LABEL =
  • LABEL = =
Dockerfile
FROM alpine:3

LABEL author="Raihan"
LABEL company="Unknown"

RUN mkdir hello
RUN echo "Hello World" > "hello/world.txt"

CMD cat "hello/world.txt"

ADD Instruction

  • ADD adalah instruksi yang dapat digunakan untuk menambahkan file dari source ke dalam folder destination di Docker Image -Perintah ADD bisa mendeteksi apakah sebuah file source merupakan file kompres seperti tar.gz, gzip, dan lain-lain. Jika mendeteksi file source adalah berupa file kompress, maka secara otomatis file tersebut akan di extract dalam folder destination
  • Perintah ADD juga bisa mendukung banyak penambahan file sekaligus
  • Penambahan banyak file sekaligus di instruksi ADD menggunakan Pattern di Go-Lang : https://pkg.go.dev/path/filepath#Match
  • ADD juga support source berupa URL

  • Instruksi ADD memiliki format sebagai berikut :

  • ADD source destination
  • Contoh :
  • ADD world.txt hello # menambah file world.txt ke folder hello
  • ADD *.txt hello # menambah semua file .txt ke folder hello
Dockerfile
FROM alpine:3

LABEL author="Raihan"
LABEL company="Unknown"

RUN mkdir hello
RUN echo "Hello World" > "hello/world.txt"
ADD http://www.vlsitechnology.org/pharosc_8.4.tar.gz .
ADD text/*.txt hello

CMD cat "hello/world.txt"

Copy Instruction

  • COPY adalah instruksi yang dapat digunakan untuk menambahkan file dari source ke dalam folder destination di Docker Image
  • Lantas apa bedanya dengan instruksi ADD kalo begitu?
  • COPY hanya melakukan copy file saja, sedangkan ADD selain melakukan copy, dia bisa mendownload source dari URL dan secara otomatis melakukan extract file kompres
  • Namun best practice nya, sebisa mungkin menggunakan COPY, jika memang butuh melakukan extract file kompres, gunakan perintah RUN dan jalankan aplikasi untuk extract file kompres tersebut

  • Instruksi COPY memiliki format sebagai berikut :

  • COPY source destination
  • Contoh :
  • COPY world.txt hello # menambah file world.txt ke folder hello
  • COPY *.txt hello # menambah semua file .txt ke folder hello
Dockerfile
FROM alpine:3

LABEL author="Raihan"
LABEL company="Unknown"

RUN mkdir hello
RUN echo "Hello World" > "hello/world.txt"
COPY text/*.txt hello

CMD cat "hello/world.txt"