Ana bilgisayar dosya sisteminde Docker konteyner içeriğini mount


24

Bir Docker konteynerinin içeriğini kontrol edebilmek istiyorum (salt okunur). Bunu yapmanın zarif bir yolu, kabın içeriğini bir dizine yerleştirmektir. Bir kabın içeriğini ana bilgisayara bir taşıyıcıya yerleştirmekten değil, bir kabın içine bir klasör yerleştirmekten bahsediyorum.

Şu an Docker'da iki depolama sürücüsü olduğunu görebiliyorum: aufs ve btrfs. Kendi Docker kurulumum btrfs kullanıyor ve / var / lib / docker / btrfs / alt hacimlere göz atmak, sistemdeki Docker konteyner başına bir dizin gösteriyor. Bununla birlikte, bu Docker'ın bir uygulama detayıdır ve bu dizinleri başka bir yere bağlamak - için yanlış hissediyorum.

Bunu yapmanın uygun bir yolu var mı, yoksa bu tür bağları desteklemesi için Docker'ı düzeltmem gerekiyor mu?


Bunları başka bir yere monte etmek neden yanlış olsun?
Michael Hampton

1
Çünkü depolama yeri bir uygulama detayıdır. Günlük liman işçisi başka bir depolama sürücüsü ekler, konum hareket eder. Bu yarı-otomatik yapmam gerekiyor ve bu yüzden herkese açık API'ler kullanmak güzel olurdu.
dflemstr

2
Hedeflerinize ulaşmak için nsenter (veya liman işçisi) üzerinde çalışmayı düşünmeniz faydalı olabilir; Tabii ki, konteynırın içindeki muayene kodunu / araçlarını doldurma zorunluluğu var.
VladFr

Linux'a bir konteyner sınırını geçmesi talimatını vermenin bir yolu yok mu?
dflemstr

@dflemstr evet, var, --volumes - bunu yapar, dizinin diğer kapsayıcıdaki temel görüntüden ve birimden birliğini oluşturduğunu gösterir, ancak bu davranış afaik belgelenmemiş gibi görünüyor
Tarnay Kálmán

Yanıtlar:


10

Bir göz atın docker export.

Kapsayıcınızdaki dosyaları hızlı bir şekilde listelemek için:

docker export CONTAINER|tar -t

İhracat:

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

Veya 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 destekliyor :

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 liman işçisi makinenize ssh yapmalısınız.


2
Resimlerim oldukça büyük (birçok yüz MiB), bu yüzden tek tek dosyaları almak için bunu yapmak çok fazla yüklüydü. Her seferinde multi-megabaytlık dosyayı oluşturacaktır.
dflemstr

@dfstrstr ile satırı kullanın, tar x PATH-IN-CONTAINERyalnızca ihtiyacınız olan dosyaları çıkartır .
laktak

... ama tüm tararşiv hala Docker
daemonunda

@ dflemstr, kurulumunuzun ne olduğundan emin değil; ancak docker export ubuntu|tar -t|grep etc/networkbenim için 3 saniye sürüyor.
laktak

Muhtemelen Docker cini aynı makinede bir ağ transferi yapmak gerekmez böylece çalışan ve ubuntu... görüntü gerçekten küçük
dflemstr

3

Kapsayıcınızın geçerli durumunu yeni bir görüntüde sürdürmek için docker commit'i kullanabilir ve içeriği incelemek için bu görüntüden etkileşimli bir kapsayıcıyı başlatabilirsiniz.

Belgelerden:

Bir konteynerin dosya değişikliklerini veya ayarlarını yeni bir görüntüye dahil etmek yararlı olabilir. Bu, etkileşimli bir kabuk çalıştırarak veya çalışan bir veri kümesini başka bir sunucuya vererek bir kapsayıcıda hata ayıklamanızı sağlar.

Bu yardımcı olur umarım.


2

Denetim programını çalıştırmak için nsenter'ı kullanabilirsiniz (muhtemelen konteynere zaten dahil edilmelidir) bir konteynır / isim alanı içinde. Ancak, konteyner dosya sistemini içinde görüldüğü gibi monte etmek için orijinal görüntüyü ve auf ise tüm katmanları veya cihaz eşleyicisi, btrfs ve kullanılan diğer (gelecekteki) depolama motorları için eşdeğer eylemi her durumda farklı şekilde eklemeniz gerekir. Muhtemelen docker'ın işi sizin için, tam olarak olması gerektiği gibi yapması ve nsenter'ı kabın içindeki incelemeyi yapmak için kullanması 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, o kapta hangi dosyaların değiştiğini gösterir.

Kalıcı ve denetlenebilir olması gereken veriler için, muhtemelen daha iyi bir örnek, kabın içindeki bir hacme sahip olması ve gerçek dosya sistemine ya da saf bir veri kabına ya da aynı kabın içine monte edilmiş olması olabilir. bu hacimleri monte ederek inceleme programı ile başka bir konteyneri başlatabileceğinizi


1

EDIT: Aşağıdaki çözümü denedim ve ne yazık ki pratikte benim için işe yaramadı. Monte edilmiş dosya sistemi, kabın dosya sistemini (hatta ile cache=no) doğru şekilde yansıtmamıştır . Bunun temel bir sorun mu yoksa yanlış bir şey mi yaptığımdan emin değilim.

Dock görüntüsüne sshd yükleyebilir ve dock kabına docker execbir ssh servisi ( /usr/sbin/sshd -D) çalıştırmak için kullanabilirsiniz ( docker kabının SSH portu 22'nin açığa çıkarılması gerektiğine dikkat edin).

Ardından, docker cpgenel ssh anahtarınızı /root/.ssh/authorized_keysliman işçisi konteynerinin dizinine kopyalamak için kullanın .

Son olarak, docker inspectkabın IP adresini bulmak için kullanın ve kabı kullanarak

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

Pratikte rahatça çalışması için bir senaryo yazmanız gerekir.

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.