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:
| Instruksi | Bentuk | Fungsi | Contoh |
|---|---|---|---|
FROM | FROM <image> [AS <nama>] | Menentukan image dasar tempat build dimulai | FROM node:22-alpine AS builder |
RUN | shell form atau exec form | Menjalankan perintah di layer baru saat build | RUN npm ci --omit=dev |
CMD | CMD ["bin", "arg"] | Perintah bawaan container; bisa ditimpa argumen docker run | CMD ["node", "server.js"] |
ENTRYPOINT | exec form atau shell form | Perintah utama container; argumen docker run menjadi parameter | ENTRYPOINT ["nginx", "-g", "daemon off;"] |
COPY | COPY <sumber>... <tujuan> | Menyalin berkas dari build context ke image | COPY package.json server.js ./ |
ADD | ADD <sumber>... <tujuan> | Seperti COPY plus ekstraksi arsip tar dan unduhan URL | ADD arsip.tar.gz / |
ENV | ENV kunci=nilai | Variabel environment yang menempel pada image hingga runtime | ENV NODE_ENV=production |
ARG | ARG nama[=nilai] | Parameter build yang hanya hidup selama proses build | ARG VERSI=2.0 |
WORKDIR | WORKDIR /jalur | Menetapkan direktori kerja untuk instruksi berikutnya | WORKDIR /app |
USER | USER <uid>[:<gid>] | Menentukan user yang menjalankan instruksi dan container | USER node |
EXPOSE | EXPOSE <port>[/<protokol>] | Mendokumentasikan port yang didengarkan aplikasi | EXPOSE 8080 |
VOLUME | VOLUME ["/jalur"] | Menandai titik mount untuk data yang harus bertahan | VOLUME /var/lib/postgresql/data |
LABEL | LABEL kunci="nilai" | Menempelkan pasangan key-value sebagai metadata image | LABEL pemelihara="Budi" |
STOPSIGNAL | STOPSIGNAL <sinyal> | Mengubah sinyal yang dikirim docker stop ke PID 1 | STOPSIGNAL SIGTERM |
HEALTHCHECK | HEALTHCHECK [OPSI] CMD <perintah> | Perintah pemeriksaan kesehatan bawaan image | HEALTHCHECK CMD pg_isready |
SHELL | SHELL ["bin", "flag"] | Mengganti shell perantara untuk bentuk shell form | SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
ONBUILD | ONBUILD <instruksi> | Menjadwalkan instruksi yang berjalan saat image dipakai sebagai basis | ONBUILD 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:
# syntax=docker/dockerfile:1
FROM node:22-alpineMari kita telaah tiga hal penting dari blok tersebut:
docker/dockerfile:1— nama image frontend BuildKit yang bertugas menerjemahkan Dockerfile; angka1adalah kanal stabil generasi pertama, yang selalu menunjuk rilis terbaru dari generasi itu.- 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.
- Buah pinning kanal stabil — fitur modern seperti heredoc,
COPY --chmod, danCOPY --linktersedia 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 #
| Flag | Fungsi | Contoh |
|---|---|---|
--chown | Menetapkan pemilik berkas hasil salinan | COPY --chown=node:node . . |
--chmod | Menetapkan bit izin berkas hasil salinan | COPY --chmod=755 entrypoint.sh /usr/local/bin/ |
--from | Mengambil berkas dari stage atau image lain | COPY --from=builder /app/dist ./dist |
--link | Membuat layer terpisah yang bisa di-cache lintas build | COPY --link package.json ./ |
--parents | Mempertahankan struktur direktori sumber relatif | COPY --parents src/ ./ |
--exclude | Menyaring berkas tanpa menyentuh .dockerignore | COPY --exclude=*.log logs/ ./ |
Flag ADD #
| Flag | Fungsi | Contoh |
|---|---|---|
--checksum | Memverifikasi integritas berkas unduhan URL | ADD --checksum=sha256:<digest> <url> ./ |
--keep-git-dir | Mempertahankan direktori .git saat ADD dari context Git | ADD --keep-git-dir . . |
--chown, --chmod | Perilaku sama dengan flag COPY | ADD --chown=node:node arsip.tar.gz / |
--exclude | Perilaku sama dengan flag COPY | ADD --exclude=*.tmp . . |
--link | Perilaku sama dengan flag COPY | ADD --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:
ADD --checksum=sha256:8f14e45fceea167a5a36dedd4bea2543f7a8c2b6e8f7c5d4a3b2c1d0e9f8a7b6 https://example.com/data.csv ./Flag RUN #
| Flag | Fungsi | Contoh |
|---|---|---|
--mount=type=cache | Me-mount direktori cache builder — cache bertahan lintas build tanpa masuk layer | RUN --mount=type=cache,target=/root/.npm npm ci |
--mount=type=secret | Me-mount rahasia hanya selama instruksi berjalan — tidak terukir di image | RUN --mount=type=secret,id=token_npm npm ci |
--mount=type=ssh | Me-mount kunci ssh-agent untuk akses repo privat | RUN --mount=type=ssh git clone [email protected]:kantor/lib.git |
--network=default | Jaringan build bawaan — mode normal | RUN --network=default apk add curl |
--network=none | Tanpa jaringan sama sekali — untuk build yang harus terbukti offline | RUN --network=none npm ci --offline |
--network=host | Memakai stack jaringan host saat build | RUN --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:
| Aspek | Bentuk exec | Bentuk shell |
|---|---|---|
| Sintaks | CMD ["node", "server.js"] | CMD node server.js |
| Eksekusi | Langsung oleh kernel, tanpa perantara | Lewat /bin/sh -c (atau shell dari SHELL) |
| Substitusi ENV | Tidak di-substitusi — variabel dibaca oleh program itu sendiri | Di-substitusi oleh shell saat baris dijalankan |
| Penerima SIGTERM | Proses kita menjadi PID 1 dan menerima sinyal langsung | /bin/sh menjadi PID 1; sinyal sering tidak diteruskan |
| Kapan dipakai | Default pilihan untuk CMD dan ENTRYPOINT produksi | Nyaman 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 #
- Dockerfile reference — sintaks resmi seluruh instruksi beserta flag BuildKit.
- Best practices untuk Dockerfile — panduan gaya penulisan Dockerfile yang sehat.
- BuildKit
— mesin di balik flag modern
RUN --mountdanCOPY --link.