Як побачити вміст зображення докера


295

Я зробив докер і можу перелічити завантажене зображення. Я хочу побачити вміст цього зображення. Шукали в мережі, але прямої відповіді немає.



10
Не дуп. Перегляд контейнера та зображення - це не одне й те саме. Ви можете переглянути початкову файлову систему або навіть перевірити, що всередині зображення немає нічого шкідливого, перш ніж воно отримає шанс запуститись.
Кейларон

4
якщо ви не можете запустити зображення як контейнер, ви можете використовувати такий інструмент, як диск ( github.com/wagoodman/dive ) або скористатися збереженням докера, щоб експортувати зображення у файл tar. Тоді ви можете вивчити дьоготь або за допомогою пірнання можна якнайшвидше вивчити зображення.
FunThomas424242

Чи не боян , але ви можете знайти відповідь тут: stackoverflow.com/a/40324326/5641227
Khalil Gharbaoui

Відповіді:


375

Ви можете просто запустити інтерактивний контейнер оболонки, використовуючи це зображення, та вивчити будь-який вміст цього зображення.

Наприклад:

docker run -it image_name sh

Або наступні зображення для entrypoint

docker run -it --entrypoint sh image_name

Або, якщо ви хочете побачити, як було створено зображення, тобто його кроки Dockerfile, ви можете:

docker image history --no-trunc image_name > image_history

Етапи будуть записані у image_historyфайл.


1
Дякую. По-перше, це те, що я шукаю. В основному вивчіть папки.
pylearn

9
Я намагаюся побачити вміст зображення, створеного за допомогою "ВІД нуля", і оболонки немає. Чи є якийсь інший спосіб перегляду вмісту? Образ, який я намагаюся бачити, - це portainer / portainer.
Хуан Ернандес

2
Чи можливо, щоб хтось бачив вміст зображення без нерестування контейнера? Чи можна вважати, що це безпечно від усіх, якщо вони не мають прав на нерест контейнера з нього?
Шабірмей

3
поєднання сказаного раніше "для контейнера Windows з точкою входу": docker run -it --entrypoint cmd <image_name>буде працювати.
Бейтан Курт

2
@JuanHernandez, так, ви можете скинути повний вміст зображення, як зазначено в stackoverflow.com/a/42677219/320594 .
Хайме Хаблуцель

197

Тут прийнята відповідь проблематична, оскільки немає гарантії, що зображення матиме якусь інтерактивну оболонку. Наприклад, зображення безпілотника / безпілотника міститься в одній команді /drone, і він має ENTRYPOINTтакож а, тому це не вдасться:

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

І це не вдасться:

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

Це не рідкість конфігурації; багато мінімальних зображень містять лише двійкові файли, необхідні для підтримки цільової служби. На щастя, існують механізми дослідження файлової системи зображень, які не залежать від вмісту зображення. Найпростіша, мабуть, docker exportкоманда, яка експортує файлову систему контейнера у вигляді архіву tar. Отже, запустіть контейнер (неважливо, виходить з ладу чи ні):

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

Потім використовуйте docker exportдля експорту файлової системи tar:

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

docker ps -lqТам означає «дати мені ідентифікатор самого останнього контейнера Докер». Ви можете замінити це явним іменем контейнера або ідентифікатором.


5
ця відповідь дуже корисна для з'ясування того, що може бути в контейнері в даний момент
Жоао Андраде,

2
Ця відповідь є більш правильною і працює для мене, оскільки я хочу вивчити вміст зображення із зарубіжною архітектурою, і я не можу "просто запустити" його
Володимир Перевалов

95

Не слід запускати контейнер лише для того, щоб побачити вміст зображення. Наприклад, ви можете шукати шкідливий вміст, а не запускати його. Використовуйте "create" замість "run";

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

11
У другому рядку вище наведено лише вміст файлової системи. Якщо ви хочете отримати всі файли у вигляді дьогтю, можете замінити його чимось на зразок docker export tmp_$$ > image-fs.tar.
Піно

Яким буде другий рядок для ОС Windows? docker export tmp_$$ | tar tЧи не буде працювати.
Олексій Мариниченко

@Alexei Marinichenko tarможе не встановлено на вашій машині. Спробуйте tar --helpперевірити це.
Абдуррахман І.

1
Це також працює, якщо в контейнері немає оболонки
Петро Дотчев

3
@AlexeiMarinichenko ви можете використовувати -oпараметр, щоб вказати файл, в який потрібно записати. Напр docker export -o c:\temp\tmp_$$.tar tmp_$$.
GiddyUpHorsey

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

Присутні наступні файли:

  • manifest.json - описує шари файлової системи та ім'я файлу json, який має властивості Container.
  • .json - властивості контейнера
  • - Кожен каталог "layerid" містить файл json, що описує властивості шару та файлову систему, пов'язані з цим шаром. Docker зберігає зображення контейнерів як шари, щоб оптимізувати простір для зберігання шляхом повторного використання шарів у зображеннях.

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

АБО

ви можете використовувати занурення для інтерактивного перегляду вмісту зображення з TUI

введіть тут опис зображення

https://github.com/wagoodman/dive


5
Це здається мені найбільш корисною відповіддю, оскільки вам не потрібно запускати контейнер, щоб отримати файли.
Алек Томас

1
Цілком погоджуюся @AlecThomas - і щоб зробити це на крок далі, чому мені взагалі потрібно dockerпросто бачити вміст того, що є, по суті, просто іншого типу архіву.
Ед Рандалл

хороший відповідь, я хотів би також вказати тег: docker save --output nginx.tar nginx:latest, в іншому випадку, згідно з документом, він буде містити «все батьківські шари, і все тег + версію»
Тарек

Це слід застосувати, оскільки це, мабуть, єдиний спосіб дослідження внутрішніх справ, якщо у вас немає будь-яких утилітів Unix. Також цей спосіб не вимагає створення контейнера.
Станіслав Німець-Євтушенко

9

Щоб перелічити детальний вміст зображення, вам потрібно запустити, docker run --rm image/name ls -alRде --rmкошти видалити, як тільки виходи утворюють контейнер.

введіть тут опис зображення


11
Це передбачає, що зображення lsдоступне і вPATH
chaosaffe

6

ДОСЛІДЖЕННЯ ЗОБРАЖЕННЯ ДОКЕРА !

  1. З'ясуйте , які оболонки там bashабо shабо ...

    Спочатку огляньте зображення: docker inspect name-of-container-or-image

    Шукайте entrypointабо cmdповертайте json.

  2. Потім зробіть: docker run --rm -it --entrypoint=/bin/bash name-of-image

    один раз всередині виконайте: ls -lsaабо будь-яку іншу команду оболонки, наприклад:cd ..

    -itЧи означає інтерактивний ... і термінал. --rmозначає видалити контейнер після запуску.


1
Проблема з цією відповіддю полягає в тому, що, як обговорювалося у прийнятій відповіді, немає гарантії того, що у вашому зображенні є якась оболонка. Або ls. Або взагалі будь-які загальні інструменти.
larsks

3

Ми можемо спробувати простіший варіант наступним чином:

docker image inspect image_id

Це працювало у версії Docker:

DockerVersion": "18.05.0-ce"

13
Це не показує вміст ; він показує лише шари тощо, які пішли в побудову зображення.
Роджер Ліпскомб

0

За допомогою Docker EE для Windows (17.06.2-ee-6 на Hyper-V Server 2016) весь вміст контейнерів Windows може бути вивчений на C:\ProgramData\docker\windowsfilter\шляху хост-операційної системи.

Не потрібно спеціального кріплення.

Префікс папки можна знайти за ідентифікатором контейнера з docker ps -aвиводу.


-1

Існує безкоштовний інструмент з відкритим кодом під назвою Anchore, який можна використовувати для сканування зображень контейнерів. Ця команда дозволить перерахувати всі файли на зображенні контейнера

Вміст зображення anchore-cli myrepo / app: останні файли

https://anchore.com/opensource/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.