docker görüntüsü için bağlam çok büyük derleme


142

Dockerfiles'ımı düzenli tutmak için Docker hakkında bilgi edinmeye çalışırken ana makinemde birkaç farklı dizin oluşturdum. Az önce çalıştırdığım Dockerfile şuna benziyor:

FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/ 
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

Gerçek rpm'm sadece 1 GB. Ancak yapmaya çalıştığımda sudo docker build -t="crystal/test" ., 3,5 GB Docker daemon'a derleme bağlamı gönderiyorum. Docker görüntüleri oluşturmaya devam ederken farkında olmadığım başka bir şey var mı? Ana makinemdeki diğer dizinlerimde daha fazla görüntü oluşturdukça belleğim birikiyor mu?


2
Derleme bağlamı, geçerli dizindeki tüm dosyalar / dizinlerdir.
Nabin

Bu dizinde yalnızca derleme için ihtiyacınız olan dosyaları saklayın. Diğer bir deyişle, Dockerfile ve Dockerfile'daki derleme görüntüsüne kopyalanan / eklenen yerel dosyalar / dizinler. Ayrıca, yararlanın.dockerignore
Vishrant

Yanıtlar:


266

Docker istemcisi, "derleme bağlamının" tamamını Docker daemon'a gönderir. Bu derleme bağlamı (varsayılan olarak) içinde bulunduğu dizinin tamamıdır Dockerfile(yani, tüm rpmsağaç).

.dockerignoreDocker'ın bazı dosyaları yoksayması için bir dosya kurabilirsiniz . Onunla denemek isteyebilirsiniz.

Alternatif olarak, hareket edebilir rpmsYukarıda bahsettiğim klasör bir dizin düzeyi Dockerfileve sembolik köprüyü sadece test.rpmiçine Dockerfilebireyin dizininde.


Birçok kullanıcının yorumlarda belirttiği gibi , benim durumumdaki 150MB -> 5GB farkının nedeni olan klasörü eklemek.git.dockerignore gerekiyor .


4
Maalesef, bu durumda sembolik bağlama mümkün görünmüyor, çünkü ADDkomut oluşturma sırasında sembolik bağları izlemiyor . Bakınız: github.com/docker/docker/issues/1676
JimmidyJoo

5
cankurtaran! Emin eklemek için gereken: geliştiriciler raylar tmp logiçin .dockerignore+ diğer özel olanlar
equivalent8

7
.dockerignore dosyasına .git klasörü eklemeyi unutmayın (git kullandığınızı varsayarak)
dsncode

8
Evet, .gitklasör varsayılan olarak dahildir - bu kesinlikle beni yakaladı.
Paul Suart

1
"Derleme bağlamı" tam olarak nedir? Docker build RUN komutunu kullanarak bu dosyaları aramaya çalıştım, ancak Dockerfile klasörümdeki dosyaları docker dosya sistemi içinde göremiyorum (derleme sırasında) Biri bana derleme bağlamının nasıl yararlı olduğuna basit bir örnek verebilir mi?
Patrick

52

2019 Güncellemesi

Docker v18.06'dan başlayarak, Build Kit adlı yeni bir imaj oluşturucuyu kullanma seçeneği bulunmaktadır .

Docker ile önceden paketlenmiştir, hiçbir şey yüklemenize gerek yoktur. DockerfileSözdizimi ile geriye dönük uyumludur Dockerfile,.

Eski Docker Build ve Yeni Docker BuildKit Karşılaştırması

Yapı dizininde çok büyük kullanılmayan bir dosya içeren bir görüntü oluşturmanın bir örneği:

Eski Docker Yapısı:

$ time docker image build --no-cache .
Sending build context to Docker daemon  4.315GB
[...]
Successfully built c9ec5d33e12e

real    0m51.035s
user    0m7.189s
sys 0m10.712s

Yeni Docker BuildKit:

$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED                                                
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
[...]
 => => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9  0.0s

real    0m0.166s
user    0m0.034s
sys 0m0.026s

Tek değişiklik DOCKER_BUILDKIT=1ortam değişkenidir, zamandaki fark çok büyüktür.

.dockerignore Dosya

Lütfen .dockerignoredosyanın hala geçerli ve kullanışlı olduğunu unutmayın . DockerfileGibi bazı komutlar COPY . .yine de .dockerignorekuralları dikkate alacaktır . Ancak, yapı dizinindeki yan dosyalar (içinde başvurulmayan Dockerfile) artık BuildKit tarafından bir "yapı bağlamı" olarak kopyalanmıyor.


1
DOCKER_BUILDKIT'in şu anda Windows Kapsayıcıları için desteklenmediğini unutmamak önemlidir. (Yalnızca Linux, Sınırlamalar altında listelenmiştir: docs.docker.com/develop/develop-images/build_enhancements )
Vaccano

18

Dockerfile ve docker-compose.yml dosyamı bir alt klasöre taşıyarak düzelttim ve harika çalıştı. Görünüşe göre docker mevcut klasörü arka plan programına gönderiyor ve benim klasörüm 9 gig'ti.


4
Bu yöntem Yasaklanmış yol verir: yapı bağlam hatası dışında, bir üst dizinden bir dosya kopyalanırsa, bunun için herhangi bir çözüm var mı?
Kitwradr

8

Bir .dockerignoredosyanız varsa ve derleme bağlamınız hala büyükse, Silver Searcher'ı kullanarak docker derleme bağlamına nelerin gönderildiğini kontrol edebilirsiniz :

ag --path-to-ignore .dockerignore --files-with-matches

Bazı **modellerin düzgün çalışmayabileceğini unutmayın .

Ek yorumlar için bu Github sorununa bakın: https://github.com/moby/moby/issues/16056


4

Benim durumumda, yanlış -fargümanlarla çalıştırdığımda - Dockerfile'ın bulunduğu dizine giden yol olmadan

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - sağ

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - yanlış


1

Derleme bağlamınızın tam kontrolüne sahip olmak istiyorsanız COPY, kapsayıcıyı daha sonra kapsayıcıya herhangi bir bağlam ve ilgili veriler olmadan tamamen de oluşturabilirsiniz.

docker build - < Dockerfile

Bunun bir dezavantajı, bu yaklaşımla ADD, yerel ana makinenizdeki dosyaları değil , yalnızca uzak bir URL'ye başvuran dockerfile içindeki şeyleri yapabileceğinizdir .

Bkz. Https://docs.docker.com/engine/reference/commandline/build/#build-with--


0

FreeStyler ile aynı sorunu yaşadım. Ancak, bağlamımdan bir üst dizinden oluşturuyordum. Yani -f argümanları doğruydu, bağlam yanlıştı.

project 
|
-------docker-dir 

Docker-dir'den derlemek aşağıdaki iyiydi

docker build -t br_base:0.1 . 

Dock-dir'den derleme bağlamı değişti. Bu nedenle komuttaki bağlamı değiştirmem gerekiyordu. Bağlam, "." İle verilir. yukarıdaki komutta.

Proje dizinindeki yeni komut şu olmalıdır:

docker build -t br_base:0.1 ./base

Buradaki bağlam "./base" ile verilmektedir.


0

görüntü oluşturuyorsanız ve kopyalamak için günlük süresi alan docker daemon'a derleme bağlamı gönderen mesaj alıyorsanız ,

ardından .dockerignore dosyasını ekleyin . kopyalanması gerekmeyen dosyaları veya dizini içermelidir.


0

İçin NodeJS Application, .dockerignorekök proje dizininize bir .dockerignoredosya ekleyin ve dosyanın içine aşağıdakileri ekleyin

node_modules
dist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.