2014-11-01 25 views
11

Bir programı derlemek için dosyamın (5 gb) içeriğini Docker kapsayıcısında kullanmam gerekiyor. *.zip dosyası yerel makinemde bulunur. Bunun için strateji olacaktır: onlar artık gerekli değildir, çünküADD veya COPY yönergesini kullanmadan Dockerfile uygulamasına bir dosyaya nasıl dosya eklenir

COPY program.zip /tmp/ 
RUN cd /tmp \ 
&& unzip program.zip \ 
&& make 

bu yaptıktan sonra Çýkartýlan dizini ve özgün *.zip dosyayı kaldırmak istiyoruz. Sorun, COPY (ve ayrıca ADD direktifi), görüntüye en az 5GB büyüklüğünde olabileceği gibi problemli olan program.zip dosyasını içerecek olan görüntüye bir katman ekleyecektir. COPY veya ADD yönergesini kullanmadan bir kapsayıcıya dosya eklemenin bir yolu var mı? wget, yerel makinemde belirtilen *.zip dosyasının çalışmasıyla çalışmayacak ve curl file://localhost/home/user/program.zip -o /tmp/program.zip da çalışmayacaktır.

+0

Yerel makinenizde önceden sıkıştırmanız mümkün değil mi? Ve sonra ihtiyacınız olan şeyleri ekleyin? – Nick

+0

Evet, ancak aynı zamanda sıkıştırılmamış klasörü hala 5 gb üzerinde olacak şekilde silmek istiyorum. Ama ne istediğimi yapmanın bir yolunu buldum. Cevap yolunda. –

+0

ve dosyayı oluşturan ve kaldıran bir make.sh dosyası? – Rondo

cevap

17

Bu kolay değildir, ancak python'dan küçük bir destekle wget veya curl aracılığıyla yapılabilir. Hiçbir url verildiğinde

wget

çalışmayacak (Tüm üç araçları genellikle. Bir *nix sistemde mevcut olmalıdır) ve

curl file://localhost/home/user/program.zip -o /tmp/ 

bir Dockerfile 'ın RUN talimatı içinden çalışmaz. Bu nedenle, wget ve curl'un program.zip adresinden erişip indirebileceği bir sunucuya ihtiyacımız olacak.

Bunu yapmak için http isteğimize hizmet eden biraz python sunucu kurduk. Bunun için python'dan http.server modülünü kullanacağız. (python veya python 3'u kullanabilirsiniz. Her ikisiyle de çalışır.).

python -m http.server --bind 192.168.178.20 8000 

python sunucu başlatıldığında dizindeki tüm dosyaları hizmet edecektir. Eğer sunucuyu başlatmak emin olmalısınız Yani ya dizinde resminizin inşa sırasında indirmek istediğiniz dosyanın bulunur veya oluşturma Programınızı içeren geçici bir dizin. Gösterim amaçları doğrultusunda en biz daha sonra bizim Dockerfile yılında wget aracılığıyla indirecektir dosyasını foo.txt yapalım:

echo "foo bar" > foo.txt 

http sunucusu başlayarak önemli olduğunu, biz LAN üzerinde yerel makinenin IP adresini belirtin. Dahası, Liman 8000. Bu şu çıktıyı görmelisiniz yapmış olan açılacaktır:

python3 -m http.server --bind 192.168.178.20 8000 
Serving HTTP on 192.168.178.20 port 8000 ... 

Şimdi bu nasıl çalıştığını göstermek için bir Dockerfile kurmak.(Biz dosya foo.txt /tmp indirilebilir gerektiğini varsayıyoruz):

FROM debian:latest 
RUN apt-get update -qq \ 
&& apt-get install -y wget 
RUN cd /tmp \ 
&& wget http://192.168.178.20:8000/foo.txt 

Şimdi bizim python sunucuda şu çıktıyı göreceksiniz oluşturma sırasında

docker build -t test . 

ile bina yapmaya başla:

172.17.0.21 - - [01/Nov/2014 23:32:37] "GET /foo.txt HTTP/1.1" 200 - 

ve görüntünün çıktı oluşturulmasına olacaktır:

Gerçekten başlayan ve sadece inşa görüntüden bir kabı girerek çalışıp çalışmadığını
Step 2 : RUN cd /tmp && wget http://192.168.178.20:8000/foo.txt 
---> Running in 49c10e0057d5 
--2014-11-01 22:56:15-- http://192.168.178.20:8000/foo.txt 
Connecting to 192.168.178.20:8000... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: 25872 (25K) [text/plain] 
Saving to: `foo.txt' 

    0K .......... .......... .....       100% 129M=0s 

2014-11-01 22:56:15 (129 MB/s) - `foo.txt' saved [25872/25872] 

---> 5228517c8641 
Removing intermediate container 49c10e0057d5 
Successfully built 5228517c8641 

Daha sonra kontrol edebilirsiniz: Daha sonra foo.txt için /tmp yılında bakabilirsiniz

docker run -i -t --rm test bash 

.

Artık herhangi bir dosyayı image'a yeni bir katman oluşturmadan ekleyebiliriz. Eğer Yapabileceğimiz söz konusu belirtildiği gibi yaklaşık 5 gb programı eklemek istediğiniz varsayarsak:

FROM debian:latest 
RUN apt-get update -qq \ 
&& apt-get install -y wget 
RUN cd /tmp \ 
&& wget http://conventiont:8000/program.zip \ 
&& unzip program.zip \ 
&& cd program \ 
&& make \ 
&& make install \ 
&& cd /tmp \ 
&& rm -f program.zip \ 
&& rm -rf program 

biz cruft 10 gb sol olmayacak Bu şekilde.

+0

Clever! Güvenilir bir yapı yapmak istiyorsanız, bunu aws gibi bir şey üzerinde barındırmanız gerekir. – retrohacker

+0

Harika cevap! Teşekkürler. – mkoertgen

+0

Bu yaklaşım harika, ancak ana bilgisayarın sabit bir IP'ye sahip olmasını gerektirir, aksi halde konukta wget'de kullanılan IP adresini değiştirmeye devam etmeniz gerekir. Bunu çözmek için bir çözüme sahip olmak güzel olurdu (Henüz iyi bir fikrim yoktu!). –

2

Yerel bir klasörü başlattığınızda kapsayıcıyla eşleştiremez ve sonra ihtiyaç duyduğunuz dosyaları kopyalayamazsınız.

sudo docker run -d -P --name myContainerName -v /localpath/zip_extract:/container/path/ yourContainerID 

https://docs.docker.com/userguide/dockervolumes/

+0

Büyük olasılıkla kapsayıcı her başlatıldığında programı açıp derlemek zorunda kalacağım (ya da en azından konteyner başladıktan sonra bir kez daha gerçekleştirin.). Tek bir Dockerfile tabanlı çözüm istedim. –

+0

Ah, cevabınızı okuyarak, şimdi ne yapmaya çalıştığınızı görüyorum. Güzel çözüm. – Emile

+0

birim eşleştirmesi yalnızca "oluşturma" sırasında değil "çalıştırma" sırasında yapılabilir. Bazı araçları (vagrant dahil) otomatik ekleme/kopya oluşturmada hacim eklerken. Bunu yapmak istemezsiniz, çünkü her ekstra talimat, son docker görüntüsünde bir deltay katmanı olarak derlenecektir. – mkoertgen

İlgili konular