2017-01-09 22 views
5

MyApp dizinini görüntüye kopyalayan bir docker dosyası oluşturmam gerekiyor.Verilen alt dizinleri atlarken bir dizini docker görüntüsüne kopyalama

MyApp 
    -libs 
    -classes 
    -resources 

Libs dizini yaklaşık 50 MB ve Sınıflar olarak dizin yaklaşık 1 MB olduğunu ve sık değişikliklere tabi tutulur nereye sık sık değişen değildir. Docker yapısını optimize etmek için Dockerfile'ın başına Libs dizini eklemeyi ve Dockerfile'ın sonunda başka dizinler eklemeyi planladım. Benim şu anki yaklaşımı Bu, gelecekte ben Uygulamam dizinde diğer bazı dizinleri liman işçisi görüntüye kopyalanacak gerekebilir gibi bir sürdürülebilir biçimde değil bu

ADD MyApp/libs /opt/MyApp/libs 
## do other operations 
ADD MyApp/classes /opt/MyApp/resources 
ADD MyApp/classes /opt/MyApp/classes 

gibidir. Benim hedef liman işçisi görüntüye kopyalanır bir dizindeki bazı dosyaları dışlamak için benzer bir komut var mı bu

ADD MyApp/libs /opt/MyApp/libs 
## do other operations 
ADD MyApp -exclude MyApp/libs /opt/MyApp 

gibi bir liman işçisi dosyası yazmak için mi?

+0

.dockerignore dosyasına bir göz atın, dokümana bakın https://docs.docker.com/engine/reference/builder/ – user2915097

+0

Bu durumda .dockerignore dosyası nasıl yardımcı olur? Aynı temel dizini, betikteki iki noktadan, sadece lib 'dizinine, lib' dizini olmadan ikinci kez kopyalamak ister. – nwinkler

cevap

2

@nwinkler tarafından açıklanan yöntemi düşündüm ve yapıyı tutarlı hale getirmek için birkaç adım ekledim. Ben Uygulamam dizinin dışarıya doğru libs dizini kopyalanan

-Dockerfile 
-MyApp 
    -libs 
    -classes 
    -resources 
-.dockerignore 
-libs 

şöyle

Şimdi benim bağlam dizin yapıdır. Ben kopyaladığınız aşırı yazılı libs dizini içinde hiçbir riski yoktur, dockerignore dosya BenimUygulamam/lib dizini yok sayar Çünkü bu

ADD libs /opt/MyApp/libs 
## do other operations 
ADD MyApp /opt/MyApp 

olarak Dockerfile Güncelleme aşağıdaki satırı

MyApp/libs/* 

içeren bir .dockerignore dosyası eklendi daha erken.

+0

Bu iyi görünüyor! – nwinkler

1

Bu, Docker'ın geçerli sürümüyle birlikte kutudan çıkar. .dockerignore dosyasını kullanmak da çalışmaz, çünkü her zaman libs klasörünü hariç tutacaktır.

Ne docker build çağırmadan önce docker build bir kabuk komut dosyası sarma ve geçici dizin içine MyApp klasörü (eksi libs klasörü) ve libs klasörü kopyalamak edilir yapabilirsiniz. Böyle

şey:

#!/usr/bin/env bash 
rm -rf temp 
mkdir -p temp 

# Copy the whole folder 
cp -r MyApp temp 

# Move the libs folder up one level 
mv temp/MyApp/libs temp 

# Now build the Docker image 
docker build ... 

Sonra temp dizinden kopyalamak için Dockerfile değişebilir:

ADD temp/libs /opt/MyApp/libs 
## do other operations 
ADD temp/MyApp /opt/MyApp 

ikinci ADD komut gelen /opt/MyApp/libs klasörünü kaldırmak riski var görüntüsü. Bu olursa, ADD komutlarını tersine çevirmeniz ve diğer her şeyden sonra libs klasörünü eklemeniz gerekebilir.

+0

Dover dosyasının bir güncellemesi gerekiyorsa Docker dosyasının en küçük boyutlu değişiklikleri oluşturmak için optimize etmem gerektiğinden Docker dosyasının en başında libs dizini eklemek istiyorum. Aynı şeyi biraz farklı bir yaklaşımla başardım. Bir cevap olarak ekleyebilirim. – Dimuthu

İlgili konular