Как увидеть содержимое образа докера


295

Я сделал вытягивание докера и могу перечислить загруженный образ. Я хочу увидеть содержимое этого изображения. Сделал поиск в сети, но нет прямого ответа.



10
Не дурак. Просмотр контейнера и изображения - это не одно и то же. Возможно, вы захотите просмотреть исходную файловую систему или даже проверить, что в образе нет ничего вредоносного, прежде чем он сможет запустить.
Кейларон

4
Если вы не можете запустить изображение как контейнер, вы можете использовать инструмент, такой как диск ( github.com/wagoodman/dive ), или вы можете использовать docker save для экспорта изображения в виде tar-файла. Затем вы можете исследовать смолу или с помощью погружения как можно скорее исследовать изображение.
FunThomas424242

Не дурак, но вы можете найти ответ здесь: stackoverflow.com/a/40324326/5641227
Халил Гарбауи

Ответы:


378

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

Например:

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
Возможно ли, что кто-то видит содержимое изображения, не порождая контейнер? Или мы можем предположить, что это безопасно от всех, если у них нет прав порождать из него контейнер?
Shabirmean

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
Этот ответ является более правильным и работает для меня, так как я хочу исследовать содержимое изображения с использованием чужой архитектуры и не могу его «просто запустить»
Владимир Перевалов

97

Вы не должны запускать контейнер только для просмотра содержимого изображения. Например, вы можете искать вредоносный контент, а не запускать его. Используйте «создать» вместо «запустить»;

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

11
2-я строка выше просто перечисляет содержимое файловой системы. Если вы хотите получить все файлы в виде tar, вы можете заменить их чем-то вроде docker export tmp_$$ > image-fs.tar.
Пино

Какой будет вторая строка для ОС Windows? Не docker export tmp_$$ | tar tбудет работать.
Алексей Мариниченко

@ Алексей Мариниченко tarможет быть не установлен на вашем компьютере. Попробуйте tar --helpпроверить это.
Абдуррахман И.

1
Это также работает, если в контейнере нет оболочки
Петр Дотчев,

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

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

Следующие файлы присутствуют:

  • manifest.json - описывает слои файловой системы и имя файла json со свойствами контейнера.
  • .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. Или вообще какие-то общие инструменты.
Жаворонки

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.