Skip to main content

Dockerfile COPY

🤔 Apa itu Instruksi Dockerfile COPY?​

Instruksi COPY digunakan untuk menyalin file atau direktori dari mesin lokal (host) ke dalam image Docker selama proses pembuatan (build).

1️⃣ Sintaks Dasar​

Sintaks umum instruksi COPY adalah:

COPY [sumber] [tujuan]
  • <sumber>: Lokasi file/direktori di mesin lokal (relatif terhadap lokasi Dockerfile).
  • <tujuan>: Path di dalam image tempat file akan disalin.

Contoh 1:

COPY app.jar /app/app.jar
COPY config/ /etc/config/

Contoh 2:

ARG ubuntu_version=24.04
FROM ubuntu:${ubuntu_version}
LABEL version="1.0"
LABEL maintainer="Ucup Topekox" email="ucup@gmail.com" environtment="development"
ENV DATABASE_NAME=book_store
RUN apt-get update && apt-get install openjdk-21-jre-headless -y
COPY Hello.class Hello.class
CMD ["/usr/bin/java", "Hello"]

2️⃣ Fitur Utama​

A. Mengubah Kepemilikan (--chown)​

Sangat disarankan menjalankan aplikasi sebagai user non-root. Anda bisa langsung mengatur pemilik file saat menyalinnya agar aplikasi memiliki izin akses yang tepat.

# Menyalin file dan menjadikannya milik user 'ucup'
COPY --chown=ucup:ucup target/*.jar app.jar

B. Menyalin dari Stage Lain (--from)​

Ini adalah kunci dari Multi-stage Build. Kita bisa menyalin hasil kompilasi dari stage sebelumnya tanpa membawa sampah build tools.

# Menyalin file dari stage bernama 'builder'
COPY --from=builder /app/target/app.jar .

C. Mendukung Wildcards​

Kita bisa menggunakan pola karakter untuk menyalin banyak file yang serupa sekaligus.

# Menyalin semua file yang berakhiran .sh
COPY *.sh /usr/local/bin/

3️⃣ Aturan Penting "Build Context"​

Instruksi COPY hanya bisa mengambil file yang berada di dalam Build Context (folder tempat kita menjalankan perintah docker build).

  • Salah ❌: COPY ../file_luar.txt /app/ (Docker tidak bisa "mengintip" keluar dari foldernya demi alasan keamanan).
  • Solusi ✅ Pindahkan file ke dalam folder yang sama dengan Dockerfile.

4️⃣ Efek terhadap Layer Caching​

COPY sangat sensitif terhadap cache:

  • Jika isi file yang kita salin berubah (meskipun hanya satu karakter), Docker akan menghapus cache untuk baris tersebut dan semua baris setelahnya.
  • Strategi: Salin file yang jarang berubah (seperti pom.xml) terlebih dahulu, jalankan instalasi library, baru kemudian salin kode sumber (src).