Docker görüntü içerikleri nasıl görüntülenir?


295

Bir liman işçisi çekimi yaptım ve indirilen görüntüyü listeleyebilirim. Bu görüntünün içeriğini görmek istiyorum. Net bir arama yaptım ama düz bir cevap yok.



10
Bir dupe değil. Kapsayıcıyı ve görüntüyü izlemek aynı şey değildir. İlk dosya sistemini görüntülemek veya hatta çalışma şansı elde etmeden önce görüntünün içinde kötü amaçlı bir şey olmadığını doğrulamak isteyebilirsiniz.
Keilaron

4
görüntüyü kapsayıcı olarak çalıştıramazsanız, sürücü ( github.com/wagoodman/dive ) gibi bir araç kullanabilir veya görüntüyü tar dosyası olarak dışa aktarmak için docker save komutunu kullanabilirsiniz. Daha sonra katranı keşfedebilir veya dalışla görüntüyü en kısa sürede keşfedebilirsiniz.
FunThomas424242

Bir dupe değil ama cevabı burada bulabilirsiniz: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Yanıtlar:


378

Bu görüntüyü kullanarak etkileşimli bir kabuk kabını çalıştırabilir ve görüntünün sahip olduğu içeriği keşfedebilirsiniz.

Örneğin:

docker run -it image_name sh

Veya entrypoint

docker run -it --entrypoint sh image_name

Ya da görüntünün nasıl inşa edildiğini görmek istiyorsanız, yani içindeki adımlar anlamına gelir Dockerfile:

docker image history --no-trunc image_name > image_history

Adımlar image_historydosyaya kaydedilir .


1
Teşekkürler. Birincisi aradığım şey. Temel olarak klasörleri keşfedin.
pylearn

9
"FROM scratch" kullanılarak oluşturulan bir görüntünün içeriğini görmeye çalışıyorum ve hiçbir kabuk kullanılabilir. İçeriği görmenin başka bir yolu var mı? Görmeye çalıştığım görüntü portainer / portainer.
Juan Hernandez

2
Birisinin bir konteyneri yumurtlamadan görüntünün içeriğini görmesi mümkün müdür? Yoksa bir konteyner üretme hakları yoksa herkesin güvenli olduğunu varsayabilir miyiz?
Shabirmean

3
: "GirişNoktası ile bir windows kapsayıcı için" önce söyleneni birleştirerek docker run -it --entrypoint cmd <image_name>çalışacaktır.
Beytan Kurt

2
@JuanHernandez, evet, resmin tüm içeriğini stackoverflow.com/a/42677219/320594 bölümünde belirtildiği gibi dökebilirsiniz .
Jaime Hablutzel

197

Burada kabul edilen cevap sorunludur, çünkü bir görüntünün herhangi bir etkileşimli kabuğa sahip olacağının garantisi yoktur. Örneğin, drone / drone görüntü tek bir komuta içerir /drone, ve bir sahiptir ENTRYPOINTbu başarısız olur böylece yanı:

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Ve bu başarısız olacak:

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

Bu nadir bir yapılandırma değildir; çok az sayıda resim yalnızca hedef hizmeti desteklemek için gerekli olan ikili dosyaları içerir. Neyse ki, görüntünün içeriğine bağlı olmayan bir görüntü dosya sistemini keşfetmek için mekanizmalar vardır . En kolayı muhtemelen docker exportbir konteyner dosya sistemini tar arşivi olarak dışa aktaracak komuttur . Bu nedenle, bir konteyner başlatın (başarısız olup olmadığı önemli değildir):

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

Ardından docker export, dosya sistemini aşağıdakilere aktarmak için kullanın tar:

$ docker export $(docker ps -lq) | tar tf -

docker ps -lq"Bana en son liman işçisi kabın id vermek" Orada anlamına gelir. Bunu açık bir kapsayıcı adı veya kimliğiyle değiştirebilirsiniz.


5
bu cevap belirli bir zamanda bir konteynerin içinde ne olabileceğini anlamak için çok yararlı
João Andrade

2
Bu cevap daha doğru ve benim için çalışıyor, çünkü görüntünün içeriğini yabancı mimariyle keşfetmek istiyorum ve "sadece
koşamıyorum

96

Yalnızca resim içeriğini görmek için bir kap başlatmamalısınız. Örneğin, kötü amaçlı içerik aramak isteyip istemediğinizi çalıştırmak isteyebilirsiniz. "Run" yerine "create" komutunu kullanın;

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$

11
Yukarıdaki 2. satır sadece dosya sistemi içeriğini listeler. Tüm dosyaları bir katran olarak almak istiyorsanız, bunun gibi bir şeyle değiştirebilirsiniz docker export tmp_$$ > image-fs.tar.
Pino

Windows işletim sistemi için 2. satır ne olacak? docker export tmp_$$ | tar tÇalışmayacaktır.
Alexei Marinichenko

@Alexei Marinichenko tarmakinenize yüklenmemiş olabilir. tar --helpKontrol etmeyi deneyin .
Abdurrahman

1
Kapta kabuk yoksa bu da işe yarar
Peter Dotchev

3
@AlexeiMarinichenko -oyazmak için dosyayı belirtmek için parametre kullanabilirsiniz . Örn docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey

62
docker save nginx > nginx.tar
tar -xvf nginx.tar

Aşağıdaki dosyalar mevcuttur:

  • manifest.json - Kapsayıcı özelliklerine sahip dosya sistemi katmanlarını ve json dosyasının adını açıklar.
  • .json - Kapsayıcı özellikleri
  • - Her “layerid” dizini, katman özelliğini ve bu katmanla ilişkilendirilmiş dosya sistemini tanımlayan json dosyası içerir. Docker, katmanları görüntüler arasında yeniden kullanarak depolama alanını optimize etmek için Kapsayıcı görüntülerini katmanlar olarak saklar.

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

VEYA

TUI ile görüntü içeriğini etkileşimli olarak görüntülemek için dalışı kullanabilirsiniz

resim açıklamasını buraya girin

https://github.com/wagoodman/dive


5
Dosyaları almak için bir kapsayıcı başlatmanız gerekmediğinden, bu benim için en yararlı cevap gibi görünüyor.
Alec Thomas

1
Kesinlikle katılıyorum @AlecThomas - ve bunu bir adım daha ileri götürmek için, neden dockersadece farklı türde bir arşiv dosyasının içeriğini görmek için neden ihtiyacım var ?
Ed Randall

iyi cevap, ben de etiketi belirtirdim: docker save --output nginx.tar nginx:latestaksi takdirde, dokümana göre, "tüm üst katmanları ve tüm etiketleri + sürümleri" içerecektir
Tarek

İçinde Unix araçları yoksa, muhtemelen iç kısımları keşfetmenin tek yolu bu olduğu için bu açıklanmalı. Ayrıca bu şekilde bir kap oluşturulmasını gerektirmez.
Stanislav German-Evtushenko

9

Bir görüntünün ayrıntılı içeriğini listelemek için çalıştırmanız gerekir; docker run --rm image/name ls -alRburada --rmçıkışlar bir kapsayıcı oluşturduğu anda kaldırılır.

resim açıklamasını buraya girin


11
Bu, görüntünün lsmevcut olduğunu varsayar vePATH
chaosaffe

6

DOCKER GÖRÜNTÜSÜNÜN KEŞFİ !

  1. Orada ne tür bir kabuk olduğunu anlayın bashya shda ...

    Önce görüntüyü inceleyin: docker inspect name-of-container-or-image

    Arayın entrypointveya cmdjson karşılığında.

  2. Sonra şunları yapın: docker run --rm -it --entrypoint=/bin/bash name-of-image

    içinde bir kez yapmak: ls -lsaveya herhangi bir kabuk komutu gibi:cd ..

    -itİnteraktif ... ve tty duruyor. --rmçalıştırmadan sonra kabın çıkarılması için standlar.


1
Bu cevapla ilgili sorun, kabul edilen cevapta tartışıldığı gibi, resminizin içinde herhangi bir kabuk olduğunu garanti etmemesidir . Veya ls. Ya da gerçekten herhangi bir ortak araç.
larsks

3

Daha basit olanı aşağıdaki gibi deneyebiliriz:

docker image inspect image_id

Bu Docker sürümünde çalıştı:

DockerVersion": "18.05.0-ce"

13
Bu içeriği göstermez ; yalnızca görüntüyü oluşturmaya başlayan katmanları vb. gösterir.
Roger Lipscombe

0

Windows için Docker EE (Hyper-V Server 2016'da 17.06.2-ee-6) ile Windows Kapsayıcılarının tüm içeriği C:\ProgramData\docker\windowsfilter\ana işletim sisteminin yolunda incelenebilir .

Özel montaj gerektirmez.

Klasör öneki, docker ps -açıktıdaki kapsayıcı kimliği ile bulunabilir .


-1

Kap görüntülerini taramak için kullanabileceğiniz Anchore adlı ücretsiz bir açık kaynak aracı vardır. Bu komut, bir kapsayıcı görüntüsündeki tüm dosyaları listelemenize olanak tanır

anchore-cli görüntü içeriği myrepo / app: en son dosyalar

https://anchore.com/opensource/

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.