Cara melihat konten gambar buruh pelabuhan


291

Saya melakukan docker pull dan dapat membuat daftar gambar yang diunduh. Saya ingin melihat isi gambar ini. Melakukan pencarian di internet tetapi tidak ada jawaban langsung.


2
Kemungkinan duplikat sistem file Penjelajah Docker
Vadzim

10
Bukan korban penipuan. Melihat wadah dan gambar bukan hal yang sama. Anda mungkin ingin melihat sistem file awal atau bahkan memvalidasi bahwa tidak ada yang berbahaya di dalam gambar sebelum mendapat kesempatan untuk dijalankan.
Keilaron

4
jika Anda tidak dapat menjalankan gambar sebagai wadah, Anda dapat menggunakan alat seperti drive ( github.com/wagoodman/dive ) atau Anda dapat menggunakan buruh pelabuhan untuk mengekspor gambar sebagai file tar. Kemudian Anda dapat menjelajahi tar atau dengan menyelam Anda dapat menjelajahi gambar.
FunThomas424242

Bukan penipuan tetapi Anda dapat menemukan jawabannya di sini: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Jawaban:


372

Anda bisa menjalankan wadah shell interaktif menggunakan gambar itu dan menjelajahi konten apa pun yang dimiliki gambar itu.

Misalnya:

docker run -it image_name sh

Atau mengikuti untuk gambar dengan entrypoint

docker run -it --entrypoint sh image_name

Atau, jika Anda ingin melihat bagaimana gambar itu dibuat, artinya langkah-langkahnya Dockerfile, Anda bisa:

docker image history --no-trunc image_name > image_history

Langkah-langkahnya akan masuk ke image_historyfile.


1
Terima kasih. Yang pertama adalah apa yang saya cari. Jelajahi folder pada dasarnya.
pylearn

9
Saya mencoba melihat konten gambar yang dibuat menggunakan "DARI awal" dan tidak ada shell yang tersedia. Apakah ada cara lain untuk melihat isinya? Gambar yang saya coba lihat adalah portainer / portainer.
Juan Hernandez

2
Mungkinkah seseorang melihat isi gambar tanpa memunculkan wadah? Atau dapatkah kita berasumsi bahwa itu aman dari semua kecuali mereka memiliki hak untuk menelurkan sebuah wadah dari itu?
Shabirmean

3
menggabungkan apa yang diceritakan sebelumnya "untuk wadah windows dengan entrypoint": docker run -it --entrypoint cmd <image_name>akan berfungsi.
Beytan Kurt

2
@JuanHernandez, ya, Anda dapat membuang seluruh isi gambar seperti yang ditunjukkan di stackoverflow.com/a/42677219/320594 .
Jaime Hablutzel

197

Jawaban yang diterima di sini bermasalah, karena tidak ada jaminan bahwa suatu gambar akan memiliki sejenis shell interaktif. Misalnya, gambar drone / drone berisi pada satu perintah /drone, dan ia memiliki ENTRYPOINTjuga, jadi ini akan gagal:

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

Dan ini akan gagal:

$ 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".

Ini bukan konfigurasi yang tidak biasa; banyak gambar minimal hanya berisi binari yang diperlukan untuk mendukung layanan target. Untungnya, ada mekanisme untuk mengeksplorasi sistem file gambar yang tidak bergantung pada konten gambar. Yang paling mudah mungkin adalah docker exportperintah, yang akan mengekspor sistem file kontainer sebagai arsip tar. Jadi, mulailah sebuah wadah (tidak masalah jika gagal atau tidak):

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

Kemudian gunakan docker exportuntuk mengekspor sistem file ke tar:

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

Di docker ps -lqsana berarti "beri saya id wadah buruh pelabuhan terbaru". Anda bisa menggantinya dengan nama atau id wadah eksplisit.


5
jawaban ini sangat membantu untuk mengetahui apa yang mungkin ada di dalam wadah pada waktu tertentu
João Andrade

2
Jawaban ini lebih tepat dan berfungsi untuk saya, karena saya ingin menjelajahi konten gambar dengan arsitektur asing dan saya tidak bisa "jalankan" saja
Vladimir Perevalov

94

Anda tidak harus memulai wadah hanya untuk melihat konten gambar. Misalnya, Anda mungkin ingin mencari konten berbahaya, bukan menjalankannya. Gunakan "buat" bukan "jalankan";

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

11
Baris ke-2 di atas hanya mencantumkan konten sistem file. Jika Anda ingin mendapatkan semua file sebagai tar, Anda dapat menggantinya dengan sesuatu seperti docker export tmp_$$ > image-fs.tar.
Pino

Apa yang akan menjadi baris ke-2 untuk OS Windows? Itu docker export tmp_$$ | tar ttidak akan bekerja.
Alexei Marinichenko

@Alexei Marinichenko tarmungkin tidak diinstal pada mesin Anda. Cobalah tar --helpuntuk memeriksanya.
Abdurrahman I.

1
Ini juga berfungsi jika tidak ada cangkang di dalam wadah
Peter Dotchev

3
@AlexeiMarinichenko Anda dapat menggunakan -oparameter untuk menentukan file untuk menulis. Misalnya docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey

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

File-file berikut ada:

  • manifest.json - Menjelaskan lapisan sistem file dan nama file json yang memiliki properti Container.
  • .json - Properti kontainer
  • - Setiap direktori "layerid" berisi file json yang menggambarkan properti layer dan sistem file yang terkait dengan layer itu. Docker menyimpan gambar Container sebagai lapisan untuk mengoptimalkan ruang penyimpanan dengan menggunakan kembali lapisan di seluruh gambar.

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

ATAU

Anda dapat menggunakan dive untuk melihat konten gambar secara interaktif dengan TUI

masukkan deskripsi gambar di sini

https://github.com/wagoodman/dive


5
Ini sepertinya jawaban yang paling berguna bagi saya, karena Anda tidak harus memulai sebuah wadah untuk mendapatkan file.
Alec Thomas

1
Sepenuhnya menyetujui @AlecThomas - dan untuk melangkah lebih jauh, mengapa saya bahkan dockerhanya perlu melihat isi dari apa, pada dasarnya, hanya jenis file arsip yang berbeda.
Ed Randall

jawaban yang baik, saya juga akan menentukan tag:, docker save --output nginx.tar nginx:latestjika tidak, menurut doc, itu akan berisi "semua lapisan induk, dan semua tag + versi"
Tarek

Ini harus dibatalkan karena ini mungkin satu-satunya cara untuk menjelajahi internal jika Anda tidak memiliki utilitas Unix di dalamnya. Juga cara ini tidak memerlukan pembuatan wadah.
Stanislav German-Evtushenko

9

Untuk membuat daftar konten terperinci dari suatu gambar Anda harus menjalankan di docker run --rm image/name ls -alRmana --rmberarti menghapus segera setelah keluar dari sebuah wadah.

masukkan deskripsi gambar di sini


11
Ini mengasumsikan bahwa gambar telah lstersedia dan dalamPATH
chaosaffe

6

MENJELAJAHI GAMBAR DOCKER !

  1. Mencari tahu apa jenis shell yang di sana bashatau shatau ...

    Periksa gambar terlebih dahulu: docker inspect name-of-container-or-image

    Mencari entrypointatau cmdmengembalikan json.

  2. Kemudian lakukan: docker run --rm -it --entrypoint=/bin/bash name-of-image

    sekali di dalam do: ls -lsaatau perintah shell lainnya seperti:cd ..

    The -itsingkatan interaktif ... dan tty. yang --rmsingkatan kontainer menghapus setelah menjalankan.


1
Masalah dengan jawaban ini adalah bahwa, seperti yang dibahas dalam jawaban yang diterima, tidak ada jaminan bahwa gambar Anda memiliki setiap shell di dalamnya. Atau ls. Atau benar-benar ada alat umum sama sekali.
larsks

4

Kita dapat mencoba yang lebih sederhana sebagai berikut:

docker image inspect image_id

Ini berfungsi dalam versi Docker:

DockerVersion": "18.05.0-ce"

12
Ini tidak menunjukkan isinya ; itu hanya menunjukkan lapisan, dll., yang masuk ke membangun gambar.
Roger Lipscombe

0

Dengan Docker EE untuk Windows (17.06.2-ee-6 di Hyper-V Server 2016) semua konten Windows Containers dapat diperiksa di C:\ProgramData\docker\windowsfilter\ jalur OS host.

Tidak diperlukan pemasangan khusus.

Awalan folder dapat ditemukan oleh id wadah dari docker ps -akeluaran.


-1

Ada alat open source gratis yang disebut Anchore yang dapat Anda gunakan untuk memindai gambar kontainer. Perintah ini akan memungkinkan Anda untuk membuat daftar semua file dalam gambar wadah

konten gambar anchore-cli myrepo / app: file terbaru

https://anchore.com/opensource/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.