是否有命令可以找出 Docker 映像的基本映像?

Jac*_*tra 9 docker

我很好奇我的图像基于什么基本图像。似乎没有简单直接的方法可以做到这一点。例如,我想知道openjdk:11-jdk.

首先,我通过执行从我的本地存储库中获取相关图像 ID 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
Run Code Online (Sandbox Code Playgroud)

此处的相关图像是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 
Run Code Online (Sandbox Code Playgroud)

我可以看到图像的图层,但看不到基本图像。

我通常做的是转到 Docker 中心页面条目(https://hub.docker.com/_/openjdk),看看是否有任何地方提到的存储库。

幸运的是,在这种情况下,有一个 Github 存储库,它是https://github.com/docker-library/openjdk。所以我去那个存储库并导航到我的特定图像的 Dockerfile ( https://github.com/docker-library/openjdk/blob/master/11/jdk/Dockerfile )。在该文件的顶部,我看到以下行:

FROM buildpack-deps:stretch-scm
Run Code Online (Sandbox Code Playgroud)

所以问题是为什么buildpack-deps:stretch-scm在我的命令输出中的任何地方都看不到?最重要的是,我想知道是否有更简单的方法来查找基本图像。

Sha*_*k V 6

对于拉取的映像,我认为没有办法在不查看实际 dockerfile 的情况下找到基础映像,因为在拉取映像时,只会为叶层下载映像清单。因此,非叶层的图像 ID 标记为<missing>in docker history,您将不知道这些层的 repo 标签。


如果映像是在您的机器上构建的,但如果您没有 dockerfile,则可以按如下方式找到基本映像:

docker history打印图层的图像 ID。然后你可以使用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
Run Code Online (Sandbox Code Playgroud)
$ docker inspect 16a54299f91e
[
    {
        "Id": "sha256:16a54299f91ef62cf19d7329645365fff3b7a3bff4dfcd8d62f46d0c9845b9c6",
        "RepoTags": [
            "python:3.7-alpine"   ---> Base image used in FROM instruction. 
Run Code Online (Sandbox Code Playgroud)

按照docker history相反顺序的输出,您可以大致重新创建 Dockerfile。


您还可以使用chenzj/dfimage运行脚本的图像来重建 dockerfile。

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$
Run Code Online (Sandbox Code Playgroud)