Soru Docker kapsayıcı içeriğini ana dosya sisteminde toplayın


Bir Docker kabının içeriğini (sadece okunur) kontrol edebilmek istiyorum. Bunu yapmanın zarif bir yolu, içeriğin bir dizine yerleştirilmesidir. Bir kapsayıcının içeriğini, ana makineye bir kapsayıcının içine yerleştirmekle değil, ana bilgisayara yerleştirmekten bahsediyorum.

Şu anda Docker'da iki depolama sürücüsü olduğunu görebiliyorum: aufs ve btrfs. Kendi Docker yüklememde btrfs kullanılır ve / var / lib / docker / btrfs / subvolumes'a göz atmak, sistemde Docker kabı başına bir dizin gösterir. Ancak bu, Docker'ın bir uygulama detayıdır ve bu dizinleri başka bir yere yerleştirmek yanlıştır.

Bunu yapmanın uygun bir yolu var mı, yoksa Docker'ı bu türden destekleri desteklemek için yamalı mıyım?


19
2017-08-18 16:08


Menşei


Bunları başka bir yere bağlamak niçin yanlış olur? - Michael Hampton♦
Çünkü depolama yeri bir uygulama detayıdır. Gün docker başka bir depolama sürücüsü ekler, konum hareket edecektir. Bu yarı otomatik hale getirmem gerekiyor ve bu sebeple kamu API'larını kullanmak güzel olurdu. - dflemstr
Hedeflerinizi gerçekleştirmek için nsenter (veya docker-enter) üzerinde çalışmayı düşünmeye değer olabilir; Elbette konteynerin içindeki inceleme kodunu / araçlarını kullanmak zorunda kalmanın sıkıntısı vardır. - VladFr
Bir konteyner sınırına bağlanmak için Linux'a talimat vermenin bir yolu yok mu? - dflemstr
@dflemstr evet, var, -volume-kinda yapar, bu, diğer muhafazanın temel görüntüsünden ve hacminden dizinin bir birleşimini monte eder gibi görünür, ancak bu davranış afaik olarak belgelenmez - Tarnay Kálmán


Cevaplar:


Şuna baksana docker export.

Kapsayıcınızdaki dosyaları hızlıca listelemek için:

docker export CONTAINER|tar -t

İhracat:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

Ya da bir dosyaya bakmak için:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8 cp'yi destekler:

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

güncelleme: Bunu çalıştırdığınızda docker makinenize ssh gerekir.


8
2017-07-29 14:03



Resimlerim oldukça büyüktür (yüzlerce MiB), böylece tek tek dosyaları almak için bunu yapmak çok fazla masraflıdır. Her seferinde çok yüz megabaytlık bir dosya oluşturur. - dflemstr
@dflemstr ile şu satırı kullanın: tar x PATH-IN-CONTAINER, sadece ihtiyacınız olan dosyaları ayıklayacaktır. - laktak
... ama bütün tar arşiv hala Docker arka planında oluşturulur ve oluşturmak için birkaç dakika sürer ... - dflemstr
@dflemstr, kurulumunuzun ne olduğundan emin değil, ör. docker export ubuntu|tar -t|grep etc/network Benim için 3 saniye sürüyor. - laktak
Bunu muhtemelen Docker daemon ile aynı makinede çalıştırıyorsunuz, böylece bir ağ aktarımı yapmanıza gerek kalmıyor. ubuntu görüntü gerçekten küçük ... - dflemstr


Kullanabilirsiniz docker işi Kapsayıcınızın mevcut durumunu yeni bir görüntüde kalıcı hale getirmek ve içeriği incelemek için bu görüntüden etkileşimli bir kapsayıcıyı başlatmak.

Belgelerden:

Bir kapsayıcının dosya değişikliklerini veya ayarlarını yapmak yararlı olabilir.   yeni bir görüntü. Bu, bir kapsayıcıyı çalıştırarak bir kapsayıcıda hata ayıklamanıza olanak tanır.   etkileşimli kabuk veya başka bir sunucuya çalışma veri kümesini dışa aktarma.

Bu yardımcı olur umarım.


3
2017-07-06 14:50





Muayene programınızı çalıştırmak için nsenter'ı kullanabilirsiniz (muhtemelen konteynerin içinde bulunmalıdır). Ancak konteyner dosya sistemini içinde görüldüğü gibi monte etmek için, orijinal görüntüyü ve aufs varsa tüm katmanları veya aygıt eşleyicisi, btrfs ve diğer (gelecekteki) depolama motorları için eşdeğer eylemi, her durumda farklı olacak şekilde monte etmeniz gerekir. Muhtemelen docker'ın işi sizin yaptığınız gibi yapmasına izin vermek ve konteyner içinde muayeneyi yapmak için nsenter'ı kullanmak daha verimli olacaktır.

Başka yaklaşımlar var. docker diff, orijinal görüntüde neyin yerine neyin değiştiğini görmek istiyorsanız, hangi kapsayıcıda hangi dosyaların değiştiğini gösterir.

Kalıcı ve denetlenebilir olması gereken veriler için, muhtemelen daha iyi bir model, kapsayıcıda bir hacme sahip olacak ve gerçek dosya sistemi üzerine veya saf bir veri kabına veya aynı kapsayıcıya yerleştirilmiş olabilir. Bu hacimleri ondan alan inceleme programı ile başka bir kap açabilirsiniz.


2
2017-10-14 11:22





DÜZENLEME: Çözümü aşağıda denedim ve maalesef uygulamada benim için iyi çalışmadı. Monte edilen dosya sistemi, dosyanın dosya sistemini doğru şekilde yansıtmıyordu (hatta cache=no). Bunun temel bir sorun mu yoksa yanlış bir şey mi yaptıklarından emin değilim.

Sshd'yi docker görüntüsüne yükleyebilir ve kullanabilirsiniz docker exec bir ssh hizmetini çalıştırmak için/usr/sbin/sshd -D) docker konteynerinde (docker konteynerinin 22 SSH portunun açıkta kalması gerektiğine dikkat ediniz).

Sonra kullan docker cp genel ssh anahtarınızı kopyalamak için /root/.ssh/authorized_keys docker kabının dizini.

Son olarak, kullan docker inspect konteynerin IP adresini bulmak ve kullanarak dosyanın dosya sistemini

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

Bu çalışmayı pratikte rahat yapmak için bir senaryo yazmanız gerekir.


1
2018-05-12 11:47