Ini sekarang dimungkinkan sejak Docker 19.03.0 pada Juli 2019 memperkenalkan "output build kustom". Lihat dokumen resmi tentang keluaran build khusus.
Untuk mengaktifkan keluaran build khusus dari image build ke host selama proses build, Anda perlu mengaktifkan BuildKit yang merupakan cara baru yang kompatibel dengan mesin untuk melakukan fase pembuatan. Lihat dokumen resmi untuk mengaktifkan BuildKit.
Hal ini dapat dilakukan dengan 2 cara:
- Atur variabel lingkungan
DOCKER_BUILDKIT=1
, atau - Atur di mesin buruh pelabuhan secara default dengan menambahkan
"features": { "buildkit": true }
ke root config json.
Dari dokumen resmi tentang keluaran build khusus:
pengekspor khusus memungkinkan Anda mengekspor artefak pembangunan sebagai file di sistem file lokal alih-alih gambar Docker, yang dapat berguna untuk membuat binari lokal, pembuatan kode, dll.
...
Eksportir lokal menulis file build yang dihasilkan ke direktori di sisi klien. Pengekspor tar mirip tetapi menulis file sebagai tarball tunggal (.tar).
Jika tidak ada jenis yang ditentukan, nilai default ke direktori keluaran pengekspor lokal.
...
Opsi --output mengekspor semua file dari tahap target. Pola umum untuk mengekspor hanya file tertentu adalah melakukan build multi-tahap dan menyalin file yang diinginkan ke tahap awal baru dengan COPY --from.
misalnya contoh Dockerfile
FROM alpine:latest AS stage1
WORKDIR /app
RUN echo "hello world" > output.txt
FROM scratch AS export-stage
COPY --from=stage1 /app/output.txt .
Berlari
DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
Ujung keluarannya adalah:
=> [export-stage 1/1] COPY --from=stage1 /app/output.txt .
0.0s
=> exporting to client
0.1s
=> => copying files 45B
0.1s
Ini menghasilkan file lokal out/output.txt
yang dibuat oleh RUN
perintah.
$ cat out/output.txt
hello world
Semua file dihasilkan dari tahap target
--output
opsi akan mengekspor semua file dari tahap target. Jadi gunakan tahap non-gores dengan COPY --from
akan menyebabkan file asing disalin ke output. Rekomendasinya adalah menggunakan tahapan awal dengan COPY --from
.
Menyalin file "dari Dockerfile" ke host tidak didukung. Dockerfile hanyalah resep yang menentukan cara membuat image.
Saat Anda membangun, Anda memiliki kesempatan untuk menyalin file dari host ke image yang sedang Anda bangun (dengan kode COPY
direktif atau ADD
)
Anda juga dapat menyalin file dari wadah (gambar yang telah docker run
'd) ke host dengan docker cp (sebenarnya, cp juga dapat menyalin dari host ke container)
Jika Anda ingin kembali ke host Anda beberapa file yang mungkin dihasilkan selama proses build (seperti misalnya memanggil skrip yang menghasilkan ssl), Anda dapat menjalankan container, memasang folder dari host Anda, dan menjalankan perintah cp.
Lihat misalnya skrip getcrt ini.
docker run -u root --entrypoint=/bin/sh --rm -i -v ${HOME}/b2d/apache:/apache apache << COMMANDS
pwd
cp crt /apache
cp key /apache
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /apache/crt
chown -R $(id -u):$(id -u) /apache/key
COMMANDS
Semuanya antara COMMANDS
adalah perintah yang dijalankan pada wadah, termasuk cp
yang menyalin di host ${HOME}/b2d/apache
folder, dipasang di dalam wadah sebagai /apache
dengan -v ${HOME}/b2d/apache:/apache
.
Itu berarti setiap kali Anda menyalin apa pun di /apache
dalam wadah, Anda sebenarnya menyalin di ${HOME}/b2d/apache
pada tuan rumah!
Meskipun tidak didukung secara langsung melalui Dockerfile
fungsi, Anda dapat menyalin file dari gambar buruh pelabuhan yang dibuat.
containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"