Изучите файлы изображений Docker, если контейнер сразу выйдет? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть изображение Docker, которое я извлек из концентратора Docker.

Когда я запускаю docker run image_name, контейнер немедленно выходит.

У меня нет доступа к исходному коду образа Docker, включая Dockerfile. Все, что у меня есть, это изображение, которое я вытащил из hub.docker.com.

Мне нужно отладить / посмотреть, что находится внутри изображения (например, посмотреть и изучить файловую систему изображения), не запуская его в качестве контейнера.

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Вы можете сделать это, изменив ENTRYPOINT файла Docker для запуска / bin / bash вместо ENTRYPOINT / CMD.

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

# comment the CMD/ENTRYPOINT
### ENTRYPOINT ["/opt/my_app.sh"]

# make a new CMD that simply starts /bin/bash
CMD ["/bin/bash"]

Затем создайте образ:

$ docker build -t srvtemp .

И запустить:

$ docker exec -ti srvtemp /bin/bash

В качестве альтернативы, вы можете добавить --entrypoint / bin / bash к аргументам команды docker exec

$ docker run -ti --name srvtemp --entrypoint /bin/bash
0 голосов
/ 29 октября 2018

Другой подход к просмотру "внутри" без необходимости run контейнера будет:

docker image history <your image name>

См. документы здесь .

Это не дает вам возможности вывести список каталогов и файлов, но вы можете получить первое представление о том, что внутри, без запуска контейнера (что может быть рискованно, если владелец опубликовал вредоносное изображение).

Пример с изображением nginx:latest:

$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f17d81b4b692: Pull complete 
d5c237920c39: Pull complete 
a381f92f36de: Pull complete 
Digest: sha256:b73f527d86e3461fd652f62cf47e7b375196063bbbd503e853af5be16597cb2e
Status: Downloaded newer image for nginx:latest

$ docker image history nginx
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
dbfc48660aeb        13 days ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  STOPSIGNAL [SIGTERM]         0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0B                  
<missing>           13 days ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx…   22B                 
<missing>           13 days ago         /bin/sh -c set -x  && apt-get update  && apt…   53.8MB              
<missing>           13 days ago         /bin/sh -c #(nop)  ENV NJS_VERSION=1.15.5.0.…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.15.5-…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           13 days ago         /bin/sh -c #(nop) ADD file:f8f26d117bc4a9289…   55.3MB
0 голосов
/ 29 октября 2018

Начать контейнер с нужного изображения, например:

docker run -it --rm image_name bash

-i Сохраняет STDIN открытым, даже если он не подключен

-t Выделяет псевдо-tty

--rm Чернослив остановлен контейнер после выхода

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

Пример docker run -it --rm centos:7 pwd выводит / (корневой каталог).

Обновление : В некоторых случаях, когда точка входа изображения использует формат bash/sh -c, указанный выше, команда (docker run -it --rm image_name bash) не будет работать, поскольку bash будет рассматриваться как дополнительный аргумент для исходной точки входа изображения.

В этом случае вы можете использовать флаг --entrypoint для достижения того же результата:

docker run -it --entrypoint "/bin/bash" image_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...