Soru Bir docker kabının başlatılmasında nasıl hata ayıklayabilirim?


Bir konteyner ile ilgili bir sorunum vardı, mükemmel şekilde oluşturulmuş olsa da düzgün bir şekilde başlamıyor. Nedeni Dockerfile (kendi kendine yapılandırılmış / etc / hosts yönlendirmesi için) eklediğiniz bir geçici çözümdür.

RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override
ADD hosts.template /etc-override/hosts
RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override

Belli ki orada bir miktar hata var, ama acaba koşucu ne zaman koşarken ne yaptığına dair daha fazla bilgi edinebilirim. örneğin, bu çalışır:

$ docker run image ls
usr bin ...

Ama bu olmaz:

$ docker run image ls -l
$

Günlüklerde hiçbir şey yok ve etkileşimli bir kabuk da bulamıyorum. Ne olduğunu görmek için strace kullanabilirim ama daha iyi bir yol umuyorum.

Docker'ı daha ayrıntılı hale getirmenin bir yolu var mı?

DÜZENLE: Andrew D.'ye teşekkürler. Yukarıdaki kodla ilgili neyin yanlış olduğunu şimdi biliyorum (bıraktım, böylece cevabı anlaşılabilir). Şimdi sorun hala böyle bir şeyde nasıl hata ayıklayabilirim ya da neden bazı iç olsun ls -l neden başarısız oldu ls yapmadı.

DÜZENLE: -D = gerçek, benim durumumda olmasa da, daha fazla çıktı verebilir ...


61
2018-05-19 15:28


Menşei


Lütfen cevaplardan birini "kabul edildi" olarak işaretlemeye çalışın, teşekkürler! - Brian Topping


Cevaplar:


Liman işçisi events komut yardımcı olabilir ve Docker günlükleri komut, görüntü başlatılamadığında bile günlükleri getirebilir.

İlk başlangıç docker events neler olduğunu görmek için arka planda.

docker events&

O zaman başarısız ol. docker run ... Komut. Sonra ekranda aşağıdaki gibi bir şey görmelisiniz:

2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die

Daha sonra, önceki mesajın başlangıç ​​onayı kodunu veya çalışma komutunun çıktısını alabilirsiniz. Sonra günlükleri komutu ile kullanabilirsiniz:

docker logs <copy the instance id from docker events messages on screen>

Artık başarısız görüntü başlangıcından bazı çıktılar görmelisiniz.

@Alexkb bir yorumda önerildiği gibi: docker events& konteyneriniz sürekli olarak AWS ECS servisi gibi bir şeyden yeniden başlatılıyorsa sorun yaratabilir. Bu senaryoda, kapsayıcı hex id'in içindeki günlüklerden dışarı alınabilmesi daha kolay olabilir. /var/log/ecs/ecs-agent.log.<DATE>. Sonra docker kullan logs <hex id>.


61
2017-12-22 13:24



Çok yararlı! Docker'a yeni ve kapıcı koşmaya çalışıyordu. Bu hata ayıklama adımları ile çözüldü. Medium.com'da aynı sorunla karşılaştı: medium.com/@jameson_37151/... - Jameson
"Konteyner bulunamadı" alıyorum !? - demented hedgehog
Garip. Sadece emin olmak için, @dementedhedgehog, "sonundaki günlük mesajından onaltılık kimliği kopyalamayı denediniz mi?"(from xxx/xxx:latest) die"? - Peter Lamberg
Bu cevaba çok teşekkür ederim, hayat kurtarıcı. Eklenecek tek şey şu: docker events& konteyneriniz sürekli olarak AWS ECS servisi gibi bir şeyden yeniden başlatılıyorsa sorun yaratabilir. Bu nedenle, bu senaryoda, kapsayıcıyı onaltı günlüğün içindeki günlüklerden çıkarmak daha kolay olabilir. /var/log/ecs/ecs-agent.log.<DATE>. Sonra kullan docker logs <hex id> şeylerin neden önyükleme yapmadığını görmek için bu cevabın önerdiği gibi. - alexkb
@alexkb Teşekkürler! Önerinizi cevabın sonuna ekledim, böylece diğerleri bunu daha kolay bulabilir. - Peter Lamberg


Şimdiye kadar öğrendiğim en iyi şey:

#stop the current demon and start it in debug modus
sudo service docker stop
dockerd -D # --debug

Sadece müşteriyi yeni bir kabuktan başlat. Yanlış anlaşılma, müşterinin aslında bir şey yaptığını düşünmekti ... ... ve sadece o şeyle iletişim kuruyor ... ... sen istemiyorsun ayıklama müşteri ama daemon kendisi (normalde).


15
2018-05-26 09:07





Benim durumumda -a (STDOUT / STDERR'e ekle) bayrağı yeterliydi:

user@machine:~$ docker start -a server_name
Error: The directory named as part of the path /log/log_path/app.log does not exist.
For help, use /usr/bin/supervisord -h

Başlangıç ​​hatasını gösterdik (bizim durumumuzda, kullanılan bir günlük kaydı supervisord). Kapsayıcı başlangıç ​​hatalarının çoğunun burada da ortaya çıkacağını farz ediyorum.


7
2018-03-29 13:27





Docker çıktısının nasıl daha eksiksiz hale getirileceği konusundaki sorunuza cevap veremiyorum ama bir .so dosyasındaki bir dizeyi değiştiren yerinde regex'in biraz çılgın olduğunu söyleyebilirim: dize yalnızca bu alana ayrılmış çok fazla alan ve Diğer girdilerin dosya ofsetlerini değiştirirseniz, elf dosyası bozulur. Perl komutunu çalıştırdıktan sonra .so dosyasında objdump veya readelf'i çalıştırmayı deneyin (LD_LIBRARY_PATH değişiklikten önce) bir konteynerin dışında - donut için dolar şimdi bozuk.

Çalışmasının nedeni bu ne yazık ki gerekli hack çünkü "tmp" ve "etc" aynı dize uzunluğunda olduğundan, ofsetler değişmez. / Tmp kullanmamayı tercih ederseniz, dizin / dkr veya benzeri bir dizin düşünün.

Bu yaklaşımı almanız GEREKİR ve istediğiniz yollar değişmezse, kütüphaneyi yeniden oluşturun ve kaynakta / etc / hosts için varsayılan yolu değiştirin. Ya da daha iyisi, değiştirilmişinizi oluştururken libnss_files.so gibi bir şeye yeniden adlandır libnss_altfiles.so ve değişim nsswitch.conf kullanmak hosts: altfiles docker kabını başlatırken (eğer docker, nsswitch.conf'a bağlanmışsa, değiştiremezsiniz). Bu, libnss_altfiles.so dosyasını temel sisteminizdeki normal kitaplıklarınızla paralel hale getirmenize izin verecektir. Eğer docker nsswitch.conf'a bağlanırsa, lib_s_files.so dosyanızın bir kopyasını / lib-override dizininde LD_LIBRARY_PATH tarafından yüklenmeye hazır olarak bırakın.

Bir kafa kadar, suid / sgid ikili dosyaları LD_LIBRARY_PATH ve LD_PRELOAD öğelerini görmezden gelir, bu nedenle bu değişkenleri kullanırsanız bazı şeyler kırılır (varsayılan: / etc / hosts kullanmaya devam edin).


2
2018-05-19 21:01



Büyük içgörü için çok teşekkürler ... Çok hızlıydım ve şimdi neler olduğunu görüyorum. Ben hala bir dosya (ls -l) basit dosya listeleme (ls) ise, neden çözmek için stat ihtiyacı almak bilmiyorum ... - estani