Есть ли команда для определения базового образа Docker? - PullRequest
5 голосов
/ 24 января 2020

Мне любопытно, на каком базовом изображении основан мой образ. Кажется, нет простого и простого способа сделать это. Так, например, я хочу знать базовый образ openjdk:11-jdk.

Прежде всего, я выбираю соответствующий идентификатор изображения из моего локального репозитория, выполняя docker images | grep openjdk, что дает мне вывод ниже.

↳ docker images | grep openjdk
openjdk 11-jdk              612d4d483eee        8 days ago          606MB
openjdk <none>              3a40000f62f1        3 weeks ago         605MB
openjdk <none>              243e95d792e3        2 months ago        605MB

Соответствующее изображение здесь 612d4d483eee поэтому я хочу посмотреть историю этого изображения, выполнив docker history 612d4d483eee, что дает мне вывод ниже (я пропустил опцию --no-trunc, потому что она портит форматирование).

↳ docker history 612d4d483eee
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
612d4d483eee        8 days ago          /bin/sh -c #(nop)  CMD ["jshell"]               0B                  
<missing>           8 days ago          /bin/sh -c set -eux;   dpkgArch="$(dpkg --pr…   322MB               
<missing>           8 days ago          /bin/sh -c #(nop)  ENV JAVA_URL_VERSION=11.0…   0B                  
<missing>           8 days ago          /bin/sh -c #(nop)  ENV JAVA_BASE_URL=https:/…   0B                  
<missing>           8 days ago          /bin/sh -c #(nop)  ENV JAVA_VERSION=11.0.6      0B                  
<missing>           3 weeks ago         /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J…   27B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV PATH=/usr/local/openj…   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/local/…   0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B                  
<missing>           3 weeks ago         /bin/sh -c set -eux;  apt-get update;  apt-g…   9.68MB              
<missing>           3 weeks ago         /bin/sh -c apt-get update && apt-get install…   142MB               
<missing>           3 weeks ago         /bin/sh -c set -ex;  if ! command -v gpg > /…   7.81MB              
<missing>           3 weeks ago         /bin/sh -c apt-get update && apt-get install…   23.3MB              
<missing>           3 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B                  
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:8f7dc710e276f54a3…   101MB 

Я вижу слои изображения, но я не вижу базового изображения.

Что я обычно делаю, это захожу на запись страницы хаба Docker (https://hub.docker.com/_/openjdk) и проверяю, есть ли где-нибудь упомянутое хранилище.

К счастью, в этом случае есть хранилище Github, которое https://github.com/docker-library/openjdk. Итак, я go в этот репозиторий и перехожу к Dockerfile моего указанного c изображения (https://github.com/docker-library/openjdk/blob/master/11/jdk/Dockerfile). Вверху этого файла я вижу следующую строку:

FROM buildpack-deps:stretch-scm

Итак, вопрос в том, почему buildpack-deps:stretch-scm нигде не видно в выходных данных моей команды? Кроме того, я хочу знать, существует ли более простой способ определения базового изображения.

1 Ответ

3 голосов
/ 24 января 2020

Для вытащенных изображений я не думаю, что есть способ найти базовое изображение, не видя фактического файла dockerfile, потому что когда вы извлекаете изображение, манифест изображения загружается только для листового слоя. Таким образом, идентификатор изображения неконечных слоев помечается как <missing> в docker history, и вы не будете знать теги репо этих слоев.


Если изображение построено на вашем компьютере, но если у вас нет файла Docker, вы можете найти базовое изображение следующим образом:

docker history печатает идентификаторы изображений слои. Тогда вы можете получить теги репо, используя docker inspect. Используемое базовое изображение обычно будет последним слоем на выходе docker history.

Например:

$ docker history t:1
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
10b4cce00fb8        3 days ago          /bin/sh -c #(nop)  CMD ["flask" "run"]          0B
824987ef6cab        3 days ago          /bin/sh -c #(nop) COPY dir:1973b65388e92428e…   406B
d4b6f433a5df        3 days ago          /bin/sh -c pip install -r requirements.txt      4.98MB
8827b3f01d00        3 days ago          /bin/sh -c #(nop) COPY file:98271fcaff00c6ef…   0B
65b8c98138e6        2 weeks ago         /bin/sh -c apk add --no-cache gcc musl-dev l…   113MB
01589531f46d        2 weeks ago         /bin/sh -c #(nop)  ENV FLASK_RUN_HOST=0.0.0.0   0B
6c4640b8027a        2 weeks ago         /bin/sh -c #(nop)  ENV FLASK_APP=app.py         0B
b4c8fc7f03d6        2 weeks ago         /bin/sh -c #(nop) WORKDIR /code                 0B
16a54299f91e        2 weeks ago         /bin/sh -c #(nop)  CMD ["python3"]              0B
$ docker inspect 16a54299f91e
[
    {
        "Id": "sha256:16a54299f91ef62cf19d7329645365fff3b7a3bff4dfcd8d62f46d0c9845b9c6",
        "RepoTags": [
            "python:3.7-alpine"   ---> Base image used in FROM instruction. 

После вывода docker history в обратном порядке вы можете приблизительно воссоздать Dockerfile.


Вы также можете использовать образ chenzj/dfimage, который запускает скрипт, который делает то же самое, чтобы восстановить файл Docker.

alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm chenzj/dfimage"

$ dfimage 10b4cce00fb8
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN /bin/sh -c apk add --no-cache gcc musl-dev linux-headers
COPY file:98271fcaff00c6efb6e58bd09ca726c29947e0cfe7031a8d98878cc01561fbbf in requirements.txt
RUN /bin/sh -c pip install -r requirements.txt
COPY dir:1973b65388e92428e30f835a67ebc8c7b00ec648fbea0717af6d501af162186b in .
CMD ["flask" "run"]
bash-3.2$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...