Saya telah membuat beberapa direktori berbeda di mesin host saya ketika saya mencoba untuk belajar tentang Docker hanya untuk menjaga dockerfiles saya terorganisir. Dockerfile saya yang baru saja saya jalankan terlihat seperti ini:
FROM crystal/centos
MAINTAINER crystal
ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm
Rpm saya yang sebenarnya hanya 1 GB. Tetapi ketika saya mencoba melakukannya sudo docker build -t="crystal/test" .
, saya mendapatkan mengirimkan konteks build ke Docker daemon 3.5 GB. Apakah ada hal lain yang saya tidak sadari ketika Anda terus membangun gambar Docker? Apakah memori saya terakumulasi ketika saya membuat lebih banyak gambar di direktori saya yang lain di mesin host saya?
.dockerignore
Jawaban:
Klien Docker mengirim seluruh "membangun konteks" ke daemon Docker. Konteks build itu (secara default) adalah seluruh direktori yang
Dockerfile
ada di dalamnya (jadi, seluruhrpms
pohon).Anda dapat mengatur
.dockerignore
file untuk membuat Docker mengabaikan beberapa file. Anda mungkin ingin bereksperimen dengannya.Atau, Anda dapat memindahkan
rpms
folder satu tingkat direktori Anda di atasDockerfile
, dan hanya symlinktest.rpm
keDockerfile
direktori.Seperti banyak pengguna tunjukkan dalam komentar, seseorang perlu menambahkan
.git
folder.dockerignore
yang merupakan penyebab perbedaan 150MB -> 5GB dalam kasus saya.sumber
ADD
perintah tidak mengikuti sym sym selama build. Lihat: github.com/docker/docker/issues/1676tmp
log
ke.dockerignore
+ yang kustom lainnya.git
folder disertakan secara default - ini pasti membuat saya ketahuan.Perbarui 2019
Mulai dari Docker v18.06 ada opsi untuk menggunakan pembuat gambar baru yang disebut Build Kit .
Sudah dipaket sebelumnya dengan Docker, tidak perlu menginstal apa pun. Ini kompatibel dengan
Dockerfile
sintaks, tidak perlu mengubahDockerfile
.Builder Docker Legacy vs Builder Docker Baru
Berikut adalah contoh membangun gambar dengan file besar yang tidak digunakan di direktori build:
Legacy Docker Build:
BuildKit Docker Baru:
Satu-satunya perubahan adalah
DOCKER_BUILDKIT=1
variabel lingkungan, perbedaan waktu sangat besar..dockerignore
MengajukanHarap dicatat, bahwa
.dockerignore
file tersebut masih valid dan bermanfaat. BeberapaDockerfile
perintah sepertiCOPY . .
masih akan mempertimbangkan.dockerignore
aturan. Tetapi file sisi dalam direktori build (tidak direferensikan dalamDockerfile
) tidak disalin lagi sebagai "membangun konteks" oleh BuildKit.sumber
Saya memperbaikinya dengan memindahkan Dockerfile dan docker-compose.yml ke subfolder dan berfungsi dengan baik. Rupanya buruh pelabuhan mengirim folder saat ini ke daemon dan folder saya adalah 9 gigs.
sumber
Jika Anda memiliki
.dockerignore
konteks file dan build masih besar, Anda dapat memeriksa apa yang sedang dikirim ke konteks build docker menggunakan The Silver Searcher :Perhatikan bahwa beberapa
**
pola mungkin tidak berfungsi dengan baik.Lihat masalah Github ini untuk komentar tambahan: https://github.com/moby/moby/issues/16056
sumber
Dalam kasus saya saat itulah saya mengeksekusi dengan
-f
argumen yang salah - tanpa path ke direktori di mana terletak Dockerfiledocker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- Baikdocker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- salahsumber
Jika Anda ingin memegang kendali penuh atas konteks pembuatan Anda, Anda juga bisa membuat wadah sepenuhnya tanpa konteks apa pun dan
COPY
data yang relevan ke dalam wadah sesudahnya.Satu kelemahan dari ini adalah bahwa dengan pendekatan ini Anda hanya dapat melihat
ADD
hal-hal di dockerfile merujuk ke URL jarak jauh, dan bukan file dari host lokal Anda.Lihat https://docs.docker.com/engine/reference/commandline/build/#build-with--
sumber
Saya memiliki masalah yang sama dengan FreeStyler. Namun saya membangun dari direktori satu dari konteks saya. Jadi argumen -f benar konteksnya salah.
Bangunan dari docker-dir berikut ini baik-baik saja
Membangun dari dock-dir konteks build berubah. Karena itu saya perlu mengubah konteks dalam perintah. Konteks diberikan oleh '.' dalam perintah di atas.
Perintah baru dari direktori proyek seharusnya
Konteks di sini diberikan oleh './base'
sumber
jika Anda membuat gambar dan mendapatkan konteks pengiriman pesan ke daemon docker yang memerlukan waktu log untuk menyalin,
kemudian tambahkan file .dockerignore . itu harus menyertakan file atau direktori yang tidak perlu disalin.
sumber
Untuk
NodeJS Application
, tambahkan.dockerignore
file direktori proyek root Anda dan di dalam.dockerignore
file tambahkan berikut inisumber