Lewati ke konten utama

Docker Build Args: Panduan Utama untuk Profesional Data

Pelajari cara meningkatkan alur kerja containerization dengan Docker build arguments untuk lingkungan yang fleksibel, aman, dan konsisten.
· 11 mnt Baca

Jelajahi bersama AI

Apakah Anda kesulitan dengan build Docker yang tidak konsisten di seluruh tim pengembangan? Build arguments mungkin adalah solusi yang Anda cari. Ini adalah solusi andalan untuk membuat image Docker yang fleksibel dan terstandarisasi. Build arguments memungkinkan Anda menyuntikkan nilai ke dalam proses build tanpa hardcode, sehingga Dockerfile Anda menjadi lebih portabel dan mudah dirawat.

Docker build args menyelesaikan masalah umum, seperti menangani base image yang berbeda, versi paket, atau pengaturan konfigurasi lintas lingkungan.

Dokumentasi resmi Docker merekomendasikan build args untuk memparametrisasi build alih-alih menyalahgunakan environment variable. Ini sangat berharga dalam pipeline CI/CD saat Anda perlu membuat image dengan konfigurasi berbeda dari Dockerfile yang sama.

> Baru mengenal Docker dan container? Ikuti panduan kami untuk cepat memahami dasarnya.

Dalam artikel ini, saya akan menunjukkan cara menggunakan Docker build arguments untuk membuat alur kerja containerization yang lebih efisien, aman, dan fleksibel.

Pengenalan Docker Build Args

Build arguments (atau build args) adalah variabel yang Anda berikan ke Docker saat build, dan hanya tersedia selama proses pembuatan image. 

Tidak seperti environment variable yang bertahan di container saat runtime, build args hanya ada dalam konteks perintah docker build dan hilang setelah image Anda dibuat. Fungsinya mirip parameter fungsi, memungkinkan Anda menyuntikkan nilai berbeda setiap kali membangun image.

Kasus penggunaan utama build args berpusat pada pembuatan Dockerfile yang fleksibel dan dapat digunakan kembali. 

Anda dapat menggunakan build args untuk menentukan base image yang berbeda (misalnya beralih antara Alpine atau Debian), menetapkan versi aplikasi tanpa memodifikasi Dockerfile, atau mengonfigurasi pengaturan saat build seperti server proxy atau URL repository. Fleksibilitas ini sangat bermanfaat dalam pipeline CI/CD di mana Anda mungkin membangun Dockerfile yang sama dengan parameter berbeda berdasarkan target deployment.

Build args sangat berguna saat Anda perlu menyesuaikan build tanpa mempertahankan banyak varian Dockerfile. Ini membantu Anda mengikuti prinsip DRY (Don't Repeat Yourself) dengan memusatkan logika konfigurasi container sembari tetap memungkinkan kustomisasi. 

Build args juga ideal untuk menangani perbedaan antara lingkungan pengembangan, pengujian, dan produksi yang seharusnya hanya memengaruhi bagaimana image dibangun, bukan bagaimana container berjalan.

Sekarang setelah Anda tahu apa itu build args, mari saya tunjukkan cara menggunakannya.

Mendefinisikan dan Memanfaatkan Build Arguments

Sekarang mari kita masuk ke aspek praktis penerapan build arguments. Diasumsikan Anda sudah menginstal dan mengonfigurasi Docker.

Sintaks dasar dan cakupan

Anda dapat mendeklarasikan build arguments di Dockerfile menggunakan instruksi ARG, yang dapat diletakkan sebelum atau sesudah instruksi FROM, tergantung kapan Anda membutuhkannya. Berikut sintaks dasarnya:

# Setting a build arg with a default value
ARG VERSION=latest

# Using the build arg
FROM ubuntu:${VERSION}

Anda dapat memberikan nilai saat membangun image menggunakan flag --build-arg:

docker build --build-arg VERSION=20.04 -t myapp:20.04 .

Image 1 - Basic Docker build args

Gambar 1 - Build args dasar Docker

Cakupan build args mengikuti aturan tertentu yang penting untuk dipahami. Arg yang dideklarasikan sebelum instruksi FROM hanya tersedia sebelum FROM dan harus dideklarasikan ulang setelahnya jika Anda membutuhkannya lagi. 

Ini terjadi karena setiap instruksi FROM memulai tahap build baru dengan cakupannya sendiri. Perilaku ini wajib Anda ingat, terutama pada multi-stage build.

Teknik deklarasi lanjutan

Mari buat aplikasi Flask "Hello World" lengkap yang menggunakan build args untuk mendukung konfigurasi berbeda:

> Pelajari cara membuat container untuk aplikasi menggunakan Docker.

Pertama, buat aplikasi Flask sederhana (app.py):

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "Hello, World!"


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

Sekalian, buat juga file requirements.txt:

flask==3.1.0

Sekarang mari buat Dockerfile yang menggunakan build args untuk konfigurasi fleksibel:

# Define build arguments with default values
ARG PYTHON_VERSION=3.13
ARG ENVIRONMENT=production

# Use the PYTHON_VERSION arg in the FROM instruction
FROM python:${PYTHON_VERSION}-slim

# Redeclare args needed after FROM
ARG ENVIRONMENT
ENV FLASK_ENV=${ENVIRONMENT}

# Set working directory
WORKDIR /app

# Copy requirements file
COPY requirements.txt .

# Install dependencies based on environment
RUN if [ "$ENVIRONMENT" = "development" ]; then \
      pip install -r requirements.txt && \
      pip install pytest black; \
    else \
      pip install --no-cache-dir -r requirements.txt; \
    fi

# Copy application code
COPY . .

# Expose port
EXPOSE 5000

# Set default command
CMD ["python", "app.py"]

> Apakah Dockerfile di atas terlihat membingungkan? Pelajari Docker dari nol melalui panduan kami.

Untuk membangun image ini untuk pengembangan dengan versi Python tertentu, jalankan perintah berikut dari Terminal Anda:

# Building for development with Python 3.11
docker build \
  --build-arg PYTHON_VERSION=3.11 \
  --build-arg ENVIRONMENT=development \
  -t flaskapp:dev .

Image 2 - Build args in a basic Python application

Gambar 2 - Build args pada aplikasi Python dasar

Dalam multi-stage build, build args memerlukan penanganan khusus. Berikut contoh lengkap yang menunjukkan cara meneruskan argumen melalui beberapa tahap dengan aplikasi Flask kita:

# Dockerfile for a multi-stage build
ARG PYTHON_VERSION=3.13

# Build stage
FROM python:${PYTHON_VERSION}-slim AS builder
ARG ENVIRONMENT=production
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
# In a real app, you might run tests or build assets here
RUN echo "Building Flask app for ${ENVIRONMENT}"

# Production stage
FROM python:${PYTHON_VERSION}-slim
ARG ENVIRONMENT
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app
COPY --from=builder /usr/local/lib/python*/site-packages /usr/local/lib/python*/site-packages
COPY --from=builder /app .

# Add metadata based on build args
LABEL environment="${ENVIRONMENT}" \
      python_version="${PYTHON_VERSION}"

EXPOSE 5000
CMD ["python", "app.py"]

Sekarang Anda dapat membangunnya dengan versi Python dan environment spesifik:

docker build \
  --build-arg PYTHON_VERSION=3.12 \
  --build-arg ENVIRONMENT=staging \
  -t flaskapp:staging .

Image 3 - Build args in multi-stage builds

Gambar 3 - Build args dalam multi-stage build

Singkatnya, pendekatan ini memungkinkan Anda mempertahankan konfigurasi yang konsisten di semua tahap build.

Build arguments yang sudah tersedia (predefined)

Docker menyediakan beberapa build args bawaan yang dapat Anda gunakan tanpa mendeklarasikannya terlebih dahulu. Di antaranya:

  • HTTP_PROXY dan HTTPS_PROXY: Berguna untuk build di lingkungan perusahaan dengan server proxy.
  • FTP_PROXY: Mirip proxy HTTP tetapi untuk koneksi FTP.
  • NO_PROXY: Menentukan host yang harus melewati proxy.
  • BUILD_DATE dan VCS_REF: Sering digunakan untuk metadata image dan versioning.

Build args bawaan ini berguna saat Anda membangun image di lingkungan dengan konfigurasi jaringan spesifik. Misalnya, di jaringan perusahaan dengan persyaratan proxy ketat, Anda dapat menggunakan:

docker build --build-arg HTTP_PROXY=http://proxy.example.com:8080 .

Pendekatan ini menjaga Dockerfile Anda tetap portabel namun tetap berfungsi di lingkungan terbatas.

Implikasi Keamanan dan Mitigasi Risiko

Meskipun build arguments menawarkan fleksibilitas, mereka juga memperkenalkan potensi risiko keamanan yang perlu Anda pahami untuk menjaga image Docker tetap aman.

Vektor kebocoran argumen

Build arguments tidak selangka yang Anda kira. Nilai build args dapat bocor melalui beberapa vektor yang sering diabaikan pengembang. Pertama, riwayat image Docker mengekspos semua build args Anda, artinya siapa pun yang memiliki akses ke image Anda dapat menjalankan docker history untuk melihat nilai yang digunakan saat build, termasuk informasi sensitif seperti API key atau token.

docker history flaskapp:dev

Image 4 - Docker history

Gambar 4 - Riwayat Docker

Layer perantara juga dapat membocorkan build arguments. Meskipun Anda menggunakan multi-stage build dan tidak menyalin layer yang berisi informasi sensitif, nilai build arg tetap ada di cache layer pada mesin build. Ini berarti siapa pun yang memiliki akses ke Docker daemon di server build Anda berpotensi mengekstrak informasi tersebut.

Log CI/CD juga menimbulkan risiko signifikan. Sebagian besar sistem CI/CD mencatat seluruh perintah build, termasuk build args yang dilewatkan di command line.

Sebagai contoh, seluruh perintah ini, termasuk API_KEY, akan terlihat di log CI/CD:

docker build --build-arg API_KEY=secret123 -t myapp:latest .

Log ini sering dapat diakses oleh lebih banyak pengembang atau bahkan disimpan di sistem pihak ketiga, yang meningkatkan permukaan eksposur nilai sensitif.

Alternatif yang aman

Untuk informasi sensitif, Anda sebaiknya menggunakan fitur secrets dari Docker BuildKit alih-alih build args. BuildKit memungkinkan Anda me-mount secrets saat proses build tanpa menyimpannya dalam image final atau riwayat.

Berikut contoh Dockerfile yang menggunakan secrets Docker BuildKit:

FROM python:3.13-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

# Use secret mount instead of build arg
RUN --mount=type=secret,id=api_key \
    cat /run/secrets/api_key > api_key.txt

EXPOSE 5000
CMD ["python", "app.py"]

Untuk membangun image ini dengan secret, pertama buat file api_key.txt:

echo "my-secret-api-key" > api_key.txt

Lalu bangun image dengan secret tersebut:

DOCKER_BUILDKIT=1 docker build \
  --secret id=api_key,src=api_key.txt \
  -t flaskapp:secure .

Image 5 - Building images with BuildKit secrets

Gambar 5 - Membangun image dengan BuildKit secrets

Untuk konfigurasi yang perlu tersedia saat runtime, environment variable tetap menjadi pendekatan yang disukai. Variabel ini dapat diatur saat menjalankan container tanpa dimasukkan ke dalam image:

# Set environment variables at runtime
docker run -e API_KEY=secret123 -p 5000:5000 flaskapp:latest

Untuk menangani konfigurasi sensitif secara aman di produksi, pertimbangkan menggunakan platform orkestrasi container seperti Kubernetes, yang menyediakan metode aman seperti Secrets untuk mengelola informasi sensitif. Docker Swarm juga menawarkan kemampuan serupa dengan manajemen secrets.

> Docker bukan satu-satunya platform containerization. Baca tentang Podman untuk mengetahui alat mana yang lebih sesuai bagi Anda.

Ingat, aturan praktisnya: gunakan build args untuk konfigurasi saat build yang tidak sensitif, gunakan BuildKit secrets untuk kebutuhan sensitif saat build, dan gunakan environment variable atau secrets pada platform orkestrasi untuk konfigurasi runtime.

Integrasi dengan Ekosistem Container

Setelah memahami dasarnya, mari jelajahi cara memanfaatkan build arguments dalam ekosistem Docker yang lebih luas dan alat build modern.

Docker Compose

Docker Compose memudahkan pendefinisian dan pembagian build arguments di aplikasi multi-container Anda.

Jika Anda ingin mengikutinya, berikut struktur proyek lengkap untuk dua layanan Flask sederhana:

flask-project/
├── docker-compose.yml         # Main compose configuration
├── .env                       # Environment variables for compose
├── web/
│   ├── Dockerfile             # Web service Dockerfile
│   ├── app.py                 # Flask application
│   └── requirements.txt       # Python dependencies
├── api/
│   ├── Dockerfile             # API service Dockerfile
│   ├── app.py                 # API Flask application  
│   └── requirements.txt       # API dependencies

Saya akan membahas cepat isi file satu per satu:

web/app.py

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def index():
    return render_template("index.html", title="Flask Web App")


@app.route("/about")
def about():
    return "About page - Web Service"


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

web/requirements.txt

flask==3.1.0

web/Dockerfile

# Web service Dockerfile
ARG PYTHON_VERSION=3.13

FROM python:${PYTHON_VERSION}-slim

# Redeclare the build arg to use it after FROM
ARG PYTHON_VERSION
ARG ENVIRONMENT=production

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app

# Copy and install requirements
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy application code
COPY . .

# Create a simple template folder and file if not exists
RUN mkdir -p templates && \
    echo "<html><body><h1>Hello from Web Service</h1><p>Python version: ${PYTHON_VERSION}</p><p>Environment: ${ENVIRONMENT}</p></body></html>" > templates/index.html

EXPOSE 5000

CMD ["python", "app.py"]

api/app.py

from flask import Flask, jsonify

app = Flask(__name__)


@app.route("/api/health")
def health():
    return jsonify({"status": "healthy"})


@app.route("/api/data")
def get_data():
    return jsonify(
        {"message": "Hello from the API service", "items": ["item1", "item2", "item3"]}
    )


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

api/requirements.txt

flask==3.1.0

api/Dockerfile

ARG PYTHON_VERSION=3.13

FROM python:${PYTHON_VERSION}-slim

# Redeclare the build arg to use it after FROM
ARG PYTHON_VERSION
ARG ENVIRONMENT=production

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV FLASK_ENV=${ENVIRONMENT}

WORKDIR /app

# Copy and install requirements
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copy application code
COPY . .

# Add metadata label based on build args
LABEL python.version="${PYTHON_VERSION}" \
      app.environment="${ENVIRONMENT}"

EXPOSE 8000

CMD ["python", "app.py"]

.env

PYTHON_VERSION=3.10
ENVIRONMENT=development

docker-compose.yml

services:
  web:
    build:
      context: ./web
      dockerfile: Dockerfile
      args:
        PYTHON_VERSION: ${PYTHON_VERSION:-3.13}
        ENVIRONMENT: ${ENVIRONMENT:-development}
    ports:
      - "5000:5000"
    depends_on:
      - api
    
  api:
    build:
      context: ./api
      dockerfile: Dockerfile
      args:
        PYTHON_VERSION: ${PYTHON_VERSION:-3.13}
        ENVIRONMENT: ${ENVIRONMENT:-production}
    ports:
      - "8000:8000"

Intinya, ini adalah cara yang sangat sederhana untuk menjalankan dua aplikasi di lingkungan terisolasi, keduanya secara bersamaan, keduanya dengan serangkaian build args tertentu.

Anda dapat menggunakan perintah ini untuk menjalankan setup multi-container:

docker compose up --build

Image 6 - Build args with Docker Compose

Gambar 6 - Build args dengan Docker Compose

Setelah beberapa detik, Anda akan melihat kedua layanan berjalan:

Image 7 - Build args with Docker Compose (2)

Gambar 7 - Build args dengan Docker Compose (2)

Cukup verbose untuk aplikasi sesederhana dua ini, tetapi inti pesannya jelas—build arguments ditetapkan di file compose dan direferensikan di Dockerfile masing-masing.

Sebagai catatan, Anda juga dapat meneruskan nilai variabel dari environment Anda ke build args, yang berguna untuk pipeline CI/CD:

services:
  web:
    build:
      context: .
      args:
        - PYTHON_VERSION=${PYTHON_VERSION:-3.10}

Dan untuk menimpa nilai ini saat menjalankan docker-compose, Anda dapat menggunakan environment variable:

PYTHON_VERSION=3.10 docker-compose up --build

Pendekatan ini memungkinkan Anda mempertahankan build yang konsisten di seluruh tim sambil tetap menawarkan fleksibilitas saat diperlukan.

Fitur BuildKit

BuildKit, mesin build modern Docker, meningkatkan proses build Anda dengan fitur yang membuat penggunaan build args semakin kuat. Saat Anda mengaktifkan BuildKit (dengan menyetel DOCKER_BUILDKIT=1), Anda membuka sejumlah kemampuan baru.

Inline cache meningkatkan kinerja build dengan memanfaatkan cache build dari image jarak jauh. Anda dapat menentukan image sumber untuk digunakan sebagai cache dengan flag --cache-from, dan BuildKit akan secara cerdas menggunakan layer image tersebut:

DOCKER_BUILDKIT=1 docker build \
  --build-arg PYTHON_VERSION=3.10 \
  --cache-from flaskapp:dev \
  -t flaskapp:latest .

Fitur BuildKit berharga lainnya adalah deterministic outputs, yang memastikan build Anda dapat direproduksi. Ini krusial saat Anda menginginkan image yang persis sama terlepas dari kapan atau di mana dibuat:

# Build with deterministic output
DOCKER_BUILDKIT=1 docker build \
  --build-arg PYTHON_VERSION=3.10 \
  --build-arg BUILD_DATE=2025-05-01 \
  --output type=docker,name=flaskapp:stable \
  .

Redaksi secret pada log BuildKit melindungi informasi sensitif selama build. 

Tidak seperti build args biasa, yang muncul di log build, BuildKit secara otomatis menyembunyikan nilai secrets:

# Create a file with the API key
echo "my-api-key-value" > ./api-key.txt

# Build with secret (value won't appear in logs)
DOCKER_BUILDKIT=1 docker build \
  --secret id=api_key,src=./api-key.txt \
  -t flaskapp:secure .

Di Dockerfile Anda, secret ini diakses dengan:

RUN --mount=type=secret,id=api_key \
    cat /run/secrets/api_key > /app/config/api_key.txt

Fitur-fitur BuildKit ini bekerja bersama build args untuk menciptakan sistem build yang lebih aman, efisien, dan dapat direproduksi yang dapat beradaptasi dengan hampir semua alur kerja containerization.

Praktik Terbaik untuk Adopsi di Perusahaan

Menerapkan Docker build arguments di tim besar memerlukan pendekatan yang terstandarisasi, setidaknya jika Anda ingin meminimalkan kebingungan dan memaksimalkan manfaat keamanan serta kinerja.

Saat mengadopsi build args di lingkungan perusahaan, mulailah dengan validasi argumen yang tepat. 

Selalu sediakan nilai default yang masuk akal untuk setiap build argument agar build tidak gagal secara tak terduga ketika argumen tidak diberikan. Anda juga sebaiknya menambahkan pemeriksaan validasi di Dockerfile untuk memastikan build args kritis memenuhi kebutuhan Anda.

Berikut contoh yang memvalidasi versi Python:

ARG PYTHON_VERSION=3.9
# Validate Python version
RUN if [[ ! "$PYTHON_VERSION" =~ ^3\.[0-9]+$ ]]; then \
      echo "Invalid Python version: ${PYTHON_VERSION}. Must be 3.x"; \
      exit 1; \
    fi

Optimalisasi caching layer sangat penting untuk mengurangi waktu build di pipeline CI/CD. 

Urutkan instruksi Dockerfile untuk memaksimalkan cache hit dengan menempatkan konten yang jarang berubah (seperti instalasi dependensi) sebelum konten yang sering berubah (seperti kode aplikasi). 

Saat menggunakan build args yang mungkin sering berubah, letakkan setelah operasi yang stabil untuk menghindari invalidasi seluruh cache:

FROM python:3.13-slim

WORKDIR /app

# Dependencies change less frequently - good cache utilization
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Build args that might change often come AFTER stable operations
ARG BUILD_NUMBER
ARG COMMIT_SHA
# Now these args won't invalidate the dependency cache

Manajemen metadata melalui build args meningkatkan keterlacakan dan kepatuhan. Gunakan build args untuk menyuntikkan metadata saat build sebagai label:

ARG BUILD_DATE
ARG VERSION
ARG COMMIT_SHA
ARG BUILD_URL

LABEL org.opencontainers.image.created="${BUILD_DATE}" Can you please provide me with access to this document?
      org.opencontainers.image.version="${VERSION}" \
      org.opencontainers.image.revision="${COMMIT_SHA}" \
      org.opencontainers.image.url="${BUILD_URL}"

Label standar ini mengikuti spesifikasi Open Container Initiative (OCI), yang berarti image Anda akan kompatibel dengan berbagai alat manajemen container.

Dokumentasi sering diabaikan, tetapi sangat penting untuk adopsi di perusahaan. 

Buat bagian README yang jelas yang mendokumentasikan semua build args yang tersedia, tujuannya, nilai default, dan contoh penggunaan. Sertakan argumen mana yang wajib dan opsional, serta dokumentasikan interaksi antarargumen. Pertimbangkan juga menambahkan informasi ini ke file konfigurasi pipeline CI/CD sebagai komentar agar pengembang memahami nilai apa yang perlu mereka sediakan:

# Example documented CI configuration
build_job:
  script:
    # BUILD_NUMBER: Unique identifier for this build (required)
    # ENVIRONMENT: Target deployment environment [dev|staging|prod] (required)
    # PYTHON_VERSION: Python version to use (optional, default: 3.9)
    - docker build
      --build-arg BUILD_NUMBER=${CI_PIPELINE_ID}
      --build-arg ENVIRONMENT=${DEPLOY_ENV}
      --build-arg PYTHON_VERSION=${PYTHON_VERSION:-3.9}
      -t myapp:${CI_PIPELINE_ID} .

Untuk adopsi kelas perusahaan yang sesungguhnya, pertimbangkan menerapkan skema build argument yang dapat di-versi dan divalidasi. Pendekatan ini memungkinkan Anda mengembangkan konfigurasi build seiring waktu sambil mempertahankan kompatibilitas mundur.

Analisis Perbandingan: Build Args vs. Environment Variables

Jika Anda ingin membuat image Docker yang aman dan fleksibel serta mengikuti praktik terbaik, Anda harus memahami kapan menggunakan build arguments dan kapan menggunakan environment variables.

Berikut tabel referensi yang dapat Anda lihat kapan saja:

Fitur

Build arguments

Environment variables

Ketersediaan

Hanya tersedia saat membangun image

Tersedia saat build dan saat container berjalan

Persistensi

Tidak dipertahankan dalam image final (kecuali secara eksplisit diubah menjadi ENV)

Dipertahankan dalam image dan tersedia untuk container yang berjalan

Keamanan

Terlihat di riwayat image dengan docker history

Tidak terlihat di riwayat image namun dapat diakses oleh proses di dalam container

Penggunaan

Ideal untuk konfigurasi saat build seperti versi, path build, flag compiler

Ideal untuk konfigurasi runtime seperti connection string, feature flag, level log

Deklarasi

Didefinisikan dengan instruksi ARG di Dockerfile

Didefinisikan dengan instruksi ENV di Dockerfile atau saat runtime

Nilai default

Dapat memberi nilai default: ARG VERSION=latest

Dapat memberi nilai default: ENV MODE=production

Cakupan

Dicakup per tahap build, harus dideklarasikan ulang setelah setiap FROM

Tersedia di semua tahap build dan diwariskan oleh child image

Metode override

--build-arg saat build

-e atau --env saat container berjalan

Perbedaan utama terletak pada waktu dan tujuan penggunaannya. Build args mengonfigurasi proses build itu sendiri, sedangkan environment variables mengonfigurasi aplikasi yang berjalan. Misalnya, Anda akan menggunakan build arg untuk memilih base image yang digunakan (ARG PYTHON_VERSION=3.10), namun menggunakan environment variable untuk memberi tahu aplikasi port mana yang harus didengarkan (ENV PORT=8080).

Dari sudut pandang keamanan, build args menimbulkan risiko lebih tinggi untuk informasi sensitif karena tetap ada di riwayat image. 

Pertimbangkan alur berikut untuk menangani berbagai jenis konfigurasi:

# Build-time configuration (non-sensitive)
ARG PYTHON_VERSION=3.13
FROM python:${PYTHON_VERSION}-slim

# Build-time secrets (use BuildKit secrets)
RUN --mount=type=secret,id=build_key \
    cat /run/secrets/build_key > /tmp/key && \
    # Use the secret for build operations
    rm /tmp/key

# Runtime configuration (non-sensitive)
ENV LOG_LEVEL=info

# Runtime secrets (should be injected at runtime, not here)
# This would be provided at runtime with:
# docker run -e API_KEY=secret123 myimage

Dalam praktiknya, pola umum adalah mengonversi build args tertentu menjadi environment variables saat dibutuhkan pada runtime:

ARG APP_VERSION=1.0.0
# Make the version available at runtime
ENV APP_VERSION=${APP_VERSION}

Untuk aplikasi perusahaan, pemisahan ini memungkinkan tim berbeda mengelola aspek berbeda dari siklus hidup aplikasi. Tim DevOps dapat memodifikasi build args untuk pembuatan image, sementara operator dapat menyesuaikan environment variable saat deployment tanpa membangun ulang image.

Merangkum Docker Build Args

Docker build args bukan sekadar fitur teknis lain — ini adalah alat andalan Anda untuk membuat image yang bekerja konsisten di seluruh tim dan lingkungan. 

Saya telah memandu cara menggunakannya dalam proyek Python sederhana, sambil tetap menjaga informasi sensitif tetap aman. Anda juga telah melihat cara mengintegrasikan build args dengan alat seperti Docker Compose.

Anggap build args sebagai fondasi strategi containerization yang fleksibel. Mulailah dari hal kecil dengan memparametrisasi versi Python pada proyek berikutnya. Setelah terasa nyaman, coba tambahkan logika kondisional untuk environment yang berbeda. Tanpa terasa, Anda akan membuat multi-stage build canggih yang dapat dikustomisasi tim tanpa mengubah Dockerfile.

Siap menyelami lebih dalam? Kursus-kursus dari DataCamp berikut adalah langkah terbaik selanjutnya:

FAQs

Apa itu Docker build arguments?

Docker build arguments (build args) adalah variabel yang Anda berikan ke proses build Docker yang hanya tersedia selama pembuatan image. Build args memungkinkan Anda menyesuaikan Dockerfile tanpa memodifikasinya, membuat build container lebih fleksibel dan dapat digunakan kembali. Anggap saja sebagai parameter yang dapat Anda atur setiap kali membangun image, sempurna untuk menangani environment atau konfigurasi yang berbeda.

Apa perbedaan build args dengan environment variables di Docker?

Build args hanya ada saat pembuatan image, sementara environment variable bertahan di container yang berjalan. Build args didefinisikan dengan instruksi ARG dan diberikan melalui flag --build-arg saat build, menjadikannya ideal untuk hal seperti memilih base image atau menetapkan konfigurasi saat build. Environment variable, yang didefinisikan dengan ENV, dirancang untuk konfigurasi runtime yang dibutuhkan aplikasi saat berjalan.

Apa kekhawatiran keamanan yang perlu saya ketahui saat menggunakan Docker build args?

Build args tidak setertutupi yang diasumsikan banyak pengembang — nilainya terlihat di riwayat image dan log CI/CD. Jangan pernah menggunakan build args untuk informasi sensitif seperti API key atau kata sandi karena siapa pun yang memiliki akses ke image Anda dapat melihat nilai tersebut. Untuk data sensitif, gunakan Docker BuildKit secrets sebagai gantinya, yang tidak disimpan di image final atau riwayat.

Bagaimana cara meneruskan build args melalui pipeline CI/CD seperti GitHub Actions?

Sebagian besar platform CI/CD mendukung Docker build args melalui file konfigurasinya. Di GitHub Actions, Anda dapat meneruskan build args di YAML workflow menggunakan parameter build-args di bawah docker/build-push-action. Anda dapat mereferensikan environment variable, repository secrets, atau nilai hardcode tergantung kebutuhan keamanan. Ini memungkinkan Anda mengotomatiskan build dengan konfigurasi berbeda berdasarkan branch, environment, atau variabel CI lainnya.

Apakah ada batas jumlah build args yang dapat saya gunakan di Dockerfile?

Tidak ada batas teknis yang ketat pada jumlah build args, tetapi terlalu banyak dapat membuat Dockerfile sulit dipahami dan dirawat. Untuk proyek data science, fokuslah pada pemfaktoran variabel penting seperti versi Python, pilihan framework, atau konfigurasi dataset. Jika Anda merasa memiliki lebih dari 8–10 build args, pertimbangkan untuk memecah Dockerfile menjadi file yang lebih kecil dan fokus, atau gunakan Docker Compose untuk mengelola kompleksitas.

Dario Radečić

Penulis

Dario Radečić

Senior Data Scientist yang berbasis di Kroasia. Penulis Tekno Teratas dengan lebih dari 700 artikel yang telah diterbitkan, menghasilkan lebih dari 10 juta tayangan. Penulis buku Machine Learning Automation with TPOT.

Topik

Terkait

blogs

Spaghetti Plot dan Jalur Badai

blogs

Tutorial Korelasi di R