Tabel perintah pada Chapter Perintah Docker CLI mengurus apa yang kita ketik di terminal, sedangkan Dockerfile mengurus apa yang dibawa oleh image itu sendiri — dan kosakata penulisan Dockerfile adalah tujuh belas instruksi yang sudah kita bedah satu per satu di Section Dockerfile dan dipakai intensif di Section Image Build dan Optimisasi. Chapter ini memampatkan seluruhnya menjadi satu tabel rujukan berkolom Instruksi, Bentuk, Fungsi, dan Contoh, lalu menambahkan tiga hal yang sering dicari saat menulis Dockerfile sungguhan: parser directive # syntax, flag modern pada COPY, ADD, dan RUN, serta perbedaan bentuk exec dan shell. Contoh pada setiap baris sengaja memakai image dan berkas yang akrab dengan kita — node:22-alpine, package.json, server.js — supaya tabel ini terbaca sebagai potongan Dockerfile yang nyata.

Tujuh Belas Instruksi #

Instruksi Dockerfile ditulis huruf kapital dan dibaca builder dari atas ke bawah; setiap instruksi RUN, COPY, dan ADD membentuk satu layer baru, sedangkan sisanya menempel sebagai metadata image — pembagian yang kita telaah pada Chapter Struktur Dockerfile. Tabel berikut adalah peta lengkap seluruh instruksi yang dikenal Dockerfile modern:

InstruksiBentukFungsiContoh
FROMFROM <image> [AS <nama>]Menentukan image dasar tempat build dimulaiFROM node:22-alpine AS builder
RUNshell form atau exec formMenjalankan perintah di layer baru saat buildRUN npm ci --omit=dev
CMDCMD ["bin", "arg"]Perintah bawaan container; bisa ditimpa argumen docker runCMD ["node", "server.js"]
ENTRYPOINTexec form atau shell formPerintah utama container; argumen docker run menjadi parameterENTRYPOINT ["nginx", "-g", "daemon off;"]
COPYCOPY <sumber>... <tujuan>Menyalin berkas dari build context ke imageCOPY package.json server.js ./
ADDADD <sumber>... <tujuan>Seperti COPY plus ekstraksi arsip tar dan unduhan URLADD arsip.tar.gz /
ENVENV kunci=nilaiVariabel environment yang menempel pada image hingga runtimeENV NODE_ENV=production
ARGARG nama[=nilai]Parameter build yang hanya hidup selama proses buildARG VERSI=2.0
WORKDIRWORKDIR /jalurMenetapkan direktori kerja untuk instruksi berikutnyaWORKDIR /app
USERUSER <uid>[:<gid>]Menentukan user yang menjalankan instruksi dan containerUSER node
EXPOSEEXPOSE <port>[/<protokol>]Mendokumentasikan port yang didengarkan aplikasiEXPOSE 8080
VOLUMEVOLUME ["/jalur"]Menandai titik mount untuk data yang harus bertahanVOLUME /var/lib/postgresql/data
LABELLABEL kunci="nilai"Menempelkan pasangan key-value sebagai metadata imageLABEL pemelihara="Budi"
STOPSIGNALSTOPSIGNAL <sinyal>Mengubah sinyal yang dikirim docker stop ke PID 1STOPSIGNAL SIGTERM
HEALTHCHECKHEALTHCHECK [OPSI] CMD <perintah>Perintah pemeriksaan kesehatan bawaan imageHEALTHCHECK CMD pg_isready
SHELLSHELL ["bin", "flag"]Mengganti shell perantara untuk bentuk shell formSHELL ["/bin/bash", "-o", "pipefail", "-c"]
ONBUILDONBUILD <instruksi>Menjadwalkan instruksi yang berjalan saat image dipakai sebagai basisONBUILD COPY package.json ./

Satu instruksi pada tabel itu menyimpan empat nilai bawaan yang perlu kita ingat saat menulisnya tanpa opsi: HEALTHCHECK. Tanpa opsi tambahan, pemeriksaan berjalan dengan --interval=30s --timeout=30s --start-period=0s --retries=3 — artinya probe ditembakkan tiap 30 detik, diberi 30 detik untuk menjawab, tanpa masa tenggang startup, dan container baru dianggap unhealthy setelah tiga kegagalan beruntun. Mekanisme status healthy dan unhealthy yang lahir dari instruksi ini kita bedah tuntas pada Chapter HEALTHCHECK dan dipakai sebagai gerbang kesiapan di Compose.

Parser Directive #

Baris pertama sebuah Dockerfile dapat diisi directive yang menentukan frontend mana yang membaca berkas tersebut. Directive yang kita pakai sepanjang Course adalah # syntax:

dockerfile
# syntax=docker/dockerfile:1
FROM node:22-alpine

Mari kita telaah tiga hal penting dari blok tersebut:

  1. docker/dockerfile:1 — nama image frontend BuildKit yang bertugas menerjemahkan Dockerfile; angka 1 adalah kanal stabil generasi pertama, yang selalu menunjuk rilis terbaru dari generasi itu.
  2. Posisi wajib di baris pertama — komentar apa pun yang muncul di atasnya membuat directive ikut dibaca sebagai komentar biasa dan frontend yang diminta tidak pernah aktif, jebakan yang kita buktikan pada Chapter Struktur Dockerfile.
  3. Buah pinning kanal stabil — fitur modern seperti heredoc, COPY --chmod, dan COPY --link tersedia tanpa perlu menunggu daemon diperbarui, karena frontend-nya diambil sebagai image dari registry.

Flag Modern pada COPY, ADD, dan RUN #

BuildKit tidak hanya membawa engine build yang lebih cepat — engine ini juga memperluas ketiga instruksi pembentuk layer dengan flag yang memecahkan masalah lama: kepemilikan berkas, izin, cache dependensi, dan rahasia build. Flag-flag berikut sudah kita praktikkan di Section Image Build dan Optimisasi; tabel-tabel ini mengumpulkannya menjadi satu pandangan.

Flag COPY #

FlagFungsiContoh
--chownMenetapkan pemilik berkas hasil salinanCOPY --chown=node:node . .
--chmodMenetapkan bit izin berkas hasil salinanCOPY --chmod=755 entrypoint.sh /usr/local/bin/
--fromMengambil berkas dari stage atau image lainCOPY --from=builder /app/dist ./dist
--linkMembuat layer terpisah yang bisa di-cache lintas buildCOPY --link package.json ./
--parentsMempertahankan struktur direktori sumber relatifCOPY --parents src/ ./
--excludeMenyaring berkas tanpa menyentuh .dockerignoreCOPY --exclude=*.log logs/ ./

Flag ADD #

FlagFungsiContoh
--checksumMemverifikasi integritas berkas unduhan URLADD --checksum=sha256:<digest> <url> ./
--keep-git-dirMempertahankan direktori .git saat ADD dari context GitADD --keep-git-dir . .
--chown, --chmodPerilaku sama dengan flag COPYADD --chown=node:node arsip.tar.gz /
--excludePerilaku sama dengan flag COPYADD --exclude=*.tmp . .
--linkPerilaku sama dengan flag COPYADD --link arsip.tar.gz /

Flag --checksum dipakai bersama digest penuh agar unduhan URL bisa diverifikasi — pola pinning dari Chapter Reproducible Build. Bentuk nyatanya terlihat seperti ini:

dockerfile
ADD --checksum=sha256:8f14e45fceea167a5a36dedd4bea2543f7a8c2b6e8f7c5d4a3b2c1d0e9f8a7b6 https://example.com/data.csv ./

Flag RUN #

FlagFungsiContoh
--mount=type=cacheMe-mount direktori cache builder — cache bertahan lintas build tanpa masuk layerRUN --mount=type=cache,target=/root/.npm npm ci
--mount=type=secretMe-mount rahasia hanya selama instruksi berjalan — tidak terukir di imageRUN --mount=type=secret,id=token_npm npm ci
--mount=type=sshMe-mount kunci ssh-agent untuk akses repo privatRUN --mount=type=ssh git clone [email protected]:kantor/lib.git
--network=defaultJaringan build bawaan — mode normalRUN --network=default apk add curl
--network=noneTanpa jaringan sama sekali — untuk build yang harus terbukti offlineRUN --network=none npm ci --offline
--network=hostMemakai stack jaringan host saat buildRUN --network=host ./uji-latensi.sh

Bentuk Exec dan Bentuk Shell #

Lima instruksi bisa ditulis dalam dua wujud — RUN, CMD, ENTRYPOINT, SHELL, dan COPY dalam konteks tertentu — dan pilihan wujud menentukan bagaimana perintah dieksekusi serta siapa yang menerima sinyal. Tabel berikut merangkum lima aspek perbedaannya, pemetaan lengkap dari Chapter CMD dan ENTRYPOINT:

AspekBentuk execBentuk shell
SintaksCMD ["node", "server.js"]CMD node server.js
EksekusiLangsung oleh kernel, tanpa perantaraLewat /bin/sh -c (atau shell dari SHELL)
Substitusi ENVTidak di-substitusi — variabel dibaca oleh program itu sendiriDi-substitusi oleh shell saat baris dijalankan
Penerima SIGTERMProses kita menjadi PID 1 dan menerima sinyal langsung/bin/sh menjadi PID 1; sinyal sering tidak diteruskan
Kapan dipakaiDefault pilihan untuk CMD dan ENTRYPOINT produksiNyaman untuk RUN panjang yang butuh variabel dan pipa shell

Konsekuensi baris keempat adalah alasan memilih exec form untuk aplikasi produksi: docker stop mengirim SIGTERM ke PID 1, dan hanya bentuk exec yang menempatkan aplikasi kita pada posisi itu — dasar dari graceful shutdown yang kita praktikkan pada Chapter Graceful Shutdown, serta pembahasan proxy sinyal lewat init: true pada Chapter Container Init Process.

Tujuh belas instruksi dan flag modernnya kini terhimpun dalam satu chapter. Tetapi Dockerfile hanya mengurus satu image — begitu aplikasi kita membutuhkan web server, database, dan cache yang saling terhubung, konfigurasi berpindah ke compose.yaml dengan kosakata kuncinya sendiri. Chapter berikutnya, Kunci compose.yaml, menyusun kunci-kunci tersebut menjadi tabel rujukan dengan tipe nilai dan fungsinya.

Referensi #