Docker kapsayıcısında durdurulan / başlatılmayan dosyalar nasıl düzenlenir


94

Birkaç kapsayıcıya bölünmüş uygulamamla ilgili hataları düzeltmeye ve sorunları gidermeye çalışırken, genellikle kapsayıcılardaki dosyaları düzenlerim:

  • ya tamamen tembelim ve nano yükleyip doğrudan kapsayıcıda düzenlerim ya da

  • Docker, dosyayı konteynerin dışına cp, düzenler, geri kopyalar ve konteyneri yeniden başlatır

Bunlar, kapsayıcı oluşturma için yeni içeriğe gelmeden önceki ara adımlardır; bu, yukarıdakileri yapmaktan çok daha uzun sürer (ki bu, elbette sadece orta seviye / uğraşmaktır).

Şimdi sık sık kabın başlangıç ​​programını bozuyorum, kırılma durumlarında ya bir düğüm betiği ya da bir python web sunucusu betiği, her ikisi de genellikle sözdizimi hatalarından dolayı başarısız oluyor.

O kapları kurtarmanın bir yolu var mı? Başlamadıkları için onlara docker işlemi uygulayamıyorum ve bu yüzden onlar benim için kayboluyor. Daha sonra derleme girdisindeki rahatsız edici dosyayı düzelttikten sonra rm / rmi / build / run yoluna gidiyorum.

Durdurulmuş bir kapsayıcıdaki dosyaları nasıl düzenleyebilirim, veya durdurulmuş bir kapsayıcıda cp veya bir kabuk başlatabilirim - bu kabı düzeltmeme izin veren herhangi bir şey?

(Biraz uzaktaki bir bilgisayarda çalışmaya ve ağ yapılandırmasını bozmaya benziyor - bağlantı bu şekilde "sonsuza kadar" kaybedilir ve varsa, geri dönüş kullanmak gerekir.)

Ana bilgisayardan Docker kapsayıcı dosyaları nasıl düzenlenir? alakalı görünüyor ancak modası geçmiş.


Bu aynı zamanda bir geçici çözüm stackoverflow.com/a/32353134/586754 olabilir - daha iyi bir çözüm umuduyla.
Andreas Reiff

1
belki bir birim eklemeyi düşünmelisiniz, böylece konteynerin içi yerine ana makinenizdeki dosyaları düzenleyebilirsiniz. Kodunuzdaki memnun sonra, özgürdürler docker cp(veya yeni bir imaj yaratmak) konteynıra dosyaları
Thomasleveil

Evet, başından beri böyle şeyler ayarlamasaydım, bu biraz geç olurdu. Sanırım bu iyileşme için çalışmıyor.
Andreas Reiff

Birçok okuyucu, dosyaları düzenlemek yerine yalnızca görüntülemek isteyecektir . Bu durumlarda, docker commityeni bir görüntüyü kırmak için komutu kullanabilirsiniz . name=$(docker commit); docker run -it $name /bin/shne istersen yapacak.
Att Righ

Öyleyse, durdurulmuş kapsayıcıların dosya sistemleri sonunda nispeten kalıcı gibi görünüyor?
Webwoman

Yanıtlar:


140

Yaptığım kötü yapılandırma değişikliği nedeniyle başlamayan bir kapsayıcıyla ilgili bir sorun yaşadım. Dosyayı durdurulmuş kapsayıcıdan kopyalayıp düzenleyebildim. gibi bir şey:

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

(dosyayı düzeltin)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf

22
Bu kabul edilen cevap olmalıdır. Nedense CP'nin durdurulmuş kaplarda çalıştığını düşünmedim. Güzel!
Proximo

Mükemmel. Konteynırdan bir dosya kopyaladım (yolunu biliyordum) ve sonra onu düzenledim ve ardından konteynere aynı konuma kopyaladım. Benim için çalıştı! Teşekkürler!
Nawaz

Bir dosyayı kaldırmanın bir yolu var mı?
kodlan

1
@kodlan Yalnızca UpperDiraldığınız yerde görünüyorsa docker container inspect- kaplama sisteminin, üst katmanda silinen temel yapıdaki dosyaları nasıl temsil ettiğini görmek için denemeniz gerekir.
Tim Baverstock

Teşekkürler, bu, macOS'ta docker'da çalışan MySQL kapsayıcımı düzeltmeme yardımcı oldu.
mazedlx

60

Kendi sorumu cevaplıyorum .. Hala daha bilgili birinden daha iyi bir cevap bekliyorum !!

2 olasılık vardır.

1) Dosya sistemini doğrudan ana bilgisayarda düzenleme . Bu biraz tehlikelidir ve kabı, muhtemelen neyin yanlış gittiğine bağlı olarak diğer verileri tamamen kırma şansı vardır.

2) Başlangıç ​​betiğini , bir bash başlatmak, düzeltmeleri / düzenlemeleri yapmak ve ardından başlangıç ​​programını tekrar istenen programa (düğüm veya daha önce neyse ) değiştirmek gibi asla başarısız olmayan bir şeye değiştirmek.

Daha fazla detay:

1) Kullanma

docker ps

çalışan kapları bulmak için veya

docker ps -a

tüm kapları bulmak (durdurulanlar dahil) ve

docker inspect (containername)

İlk değerlerden biri olan "Id" yi arayın.

Bu, uygulama detaylarını içeren ve değişebilecek kısımdır, bu şekilde konteynerinizi kaybedebileceğinizi unutmayın.

Git

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

ve orada, kabın dayandığı görüntüye doğru değiştirilen tüm dosyaları bulacaksınız. Dosyaların üzerine yazabilir, dosya ekleyebilir veya düzenleyebilirsiniz.

Yine, bunu tavsiye etmem.

2) https://stackoverflow.com/a/32353134/586754 adresinde açıklandığı gibi json config.json yapılandırmasını aşağıdaki gibi bir yolda bulabilirsiniz:

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

Orada değiştirgeleri örneğin "nodejs app.js" den "/ bin / bash" olarak değiştirebilirsiniz. Şimdi docker servisini yeniden başlatın ve konteyneri başlatın (şimdi doğru şekilde başladığını görmelisiniz). Kullanmalısın

docker start -i (containername)

hemen çıkmamasını sağlamak için. Artık kapsayıcıyla çalışabilir ve / veya daha sonra,

docker exec -ti (containername) /bin/bash

Ayrıca docker cp, kapsayıcı dışında düzenlenen dosyaları kopyalamak için oldukça kullanışlıdır.

Ayrıca, konteynır zaten az çok "kaybolursa" bu önlemlere geri dönülmelidir, bu nedenle herhangi bir değişiklik bir gelişme olacaktır.


Hâlâ daha iyi bir cevap umuyorum - bu yüzden bir tane vermekten çekinmeyin, ben de "cevaplı" etiketi taşıyacağım.
Andreas Reiff

İkinci yolu kullandım ve config.jsonher düzenlediğimde dosyaların üzerine yazmaya zorlamak için docker hizmetini yeniden başlatmak zorunda kaldım
Vitaly Isaev

2
Config.v2.json'ım var ve zombi konteynırını her başlattığımda, Path / EntryPoint güncellememi geri alıyor ve bir kez daha ölüyor. "Docker cp" kullanarak giriş noktası.sh betiğini güncellemek için sadece bash çalıştırmak düzeltildi.
Curtis Yallop

@CurtisYallop Ben de aynı şeyi yaşıyorum. Nasıl çözdün?
Brett McLain

1
@BrettMcLain Ana bilgisayarda düzenlemek yerine docker cp kullandım. Şöyle: Giriş noktası komut dosyası konumunu bulun: "docker inspect container_name | grep Entry". Komut dosyasını alın: "docker cp container_name: /entrypoint.sh ./". (Düzenleyin) Komut dosyasını konteynere geri koyun: "docker cp inputpoint.sh container_name: /entrypoint.sh". Giriş noktasını bash çalıştırabilir veya bir uyku döngüsü çalıştırabilirsiniz, örneğin "while:; do sleep 10; done". İlk komut dosyası satırı "#! / Bin / bash" olmalıdır.
Curtis Yallop

9

Konteynır dosya sistemini doğrudan düzenleyebilirsiniz, ancak bunun iyi bir fikir olup olmadığını bilmiyorum. Öncelikle, konteyner için çalışma zamanı kökü olarak kullanılan dizinin yolunu bulmanız gerekir. Çalıştır docker container inspect id/name. UpperDirJSON çıktısında anahtarı arayın .

Bu senin dizinin.


Dizini buldum, ancak bu tüm dosyaları içermiyordu.
aioobe

OverlayFS'dir, bu nedenle dosyalarınız bu dizinlerde bir tane olmalıdır.
Tejas Sarade

Dizin adı "UpperDir" den farklı olabilir, örneğin benim durumumda bu Source. Ama işe yaradı!
Rajni Kewlani

0

Durdurulmuş bir konteyneri yeniden başlatmaya çalışıyorsanız ve yanlış konfigürasyon nedeniyle konteyneri değiştirmeniz gerekiyorsa ancak konteyner başlamıyorsa, "docker cp" komutunu kullanarak (önceki öneriye benzer) çalışan aşağıdakileri yapabilirsiniz. Bu prosedür, dosyaları kaldırmanıza ve gereken diğer değişiklikleri yapmanıza olanak tanır. Şansınız varsa, aşağıdaki adımların çoğunu atlayabilirsiniz.

  1. Giriş noktasını bulmak için docker inspect kullanın (bazı sürümlerde Path olarak adlandırılır)
  2. Docker run kullanarak bir klon oluşturun
  3. Docker exec -ti bash kullanarak klon girin (eğer * nix kapsayıcısı)
  4. Bulmak için klona bakarak giriş noktası dosya konumunu bulun
  5. Docker cp: ./ kullanarak eski giriş noktası komut dosyasını kopyalayın
  6. Örneğin, yeni bir giriş noktası komut dosyasını değiştirin veya oluşturun

    #!/bin/bash tail -f /etc/hosts

  7. betiğin yürütme haklarına sahip olduğundan emin olun
  8. Docker cp ./ kullanarak eski giriş noktasını değiştirin:
  9. start ile eski konteyneri başlatın
  10. başlangıçlara kadar 6-9. adımları yineleyin
  11. Kapsayıcıdaki sorunları düzeltin
  12. Gerekirse giriş noktasını geri yükleyin ve 6-9. Adımları gerektiği gibi yeniden yapın
  13. Gerekirse klonu kaldırın
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.