Skip to main content

Dockerfile USER

🤔 Apa itu Instruksi Dockerfile USER?​

Secara default, Docker menjalankan semua proses di dalam kontainer sebagai root (administrator). Instruksi USER digunakan untuk mengubah identitas pengguna (UID) atau grup (GID) yang menjalankan aplikasi.

  • Fungsi: Mengalihkan hak akses dari Superuser (root) ke Normal User.
  • Efek: Semua instruksi RUN, CMD, dan ENTRYPOINT yang berada di bawahnya akan dijalankan menggunakan identitas user tersebut.

1️⃣ Mengapa Sangat Penting? (Security First)​

  • Mencegah Escalation: Jika aplikasi (misal: Java API) diretas, penyerang hanya akan memiliki hak akses terbatas sesuai user yang Anda buat. Mereka tidak bisa mengubah file sistem, menginstal paket software, atau merusak Kernel host.
  • Kepatuhan (Compliance): Standar industri seperti PCI-DSS, SOC2, dan orkestrator seperti Kubernetes sering kali melarang kontainer berjalan sebagai root.
  • Manajemen File: Membantu sinkronisasi izin akses file antara komputer host dan kontainer saat menggunakan Volumes.

2️⃣ Alur Kerja Implementasi (Best Practice)​

Kita tidak bisa langsung menulis USER ucup jika user tersebut belum dibuat di dalam sistem operasi image. Berikut adalah alur standar:

A. Di Alpine Linux (Minimalis)​

# 1. Buat grup dan user (-S untuk system user, -D untuk tanpa password)
RUN addgroup -S ucupgroup && adduser -S ucup -G ucupgroup

# 2. Atur folder kerja dan izin akses (SAAT MASIH ROOT)
WORKDIR /app
COPY --chown=ucup:ucupgroup . .

# 3. Pindah ke user non-root
USER ucup

# Sekarang CMD berjalan sebagai ucup
CMD ["java", "-jar", "app.jar"]

B. Di UBI / Debian (Enterprise)​

# Menggunakan useradd (biasanya butuh instalasi shadow-utils di UBI-minimal)
RUN groupadd -r ucupgroup && useradd -r -g ucupgroup ucup
USER ucup

3️⃣ Memahami --chown pada COPY​

Saat menggunakan USER, file yang disalin melalui COPY tetap akan dimiliki oleh root kecuali menggunakan flag --chown.

  • Wajib: COPY --chown=ucup:ucupgroup . .
  • Tanpa ini, user ucup tidak akan bisa membaca atau menulis file aplikasinya sendiri.

4️⃣ Cara Mengecek User yang Aktif​

Kita bisa memastikan siapa yang menjalankan kontainer dengan perintah:

docker exec [NAMA_KONTAINER] whoami
# Hasilnya harus 'ucup', bukan 'root'

Atau melalui inspect:

docker inspect --format='{{.Config.User}}' [NAMA_IMAGE]

5️⃣ Tips​

  • Gunakan UID/GID Numerik: Beberapa platform keamanan lebih suka menggunakan angka daripada nama (misal: USER 1001) untuk menghindari kebingungan nama di database user Linux.
  • Lakukan Instalasi Dulu: Pastikan semua perintah apk add atau apt install dilakukan sebelum instruksi USER, karena user biasa tidak punya izin untuk menginstal software.
  • Prinsip Least Privilege: Hanya berikan izin tulis pada folder yang benar-benar dibutuhkan (seperti folder /logs atau /tmp).