是否有命令来查找Docker映像的基本映像?

时间:2020-01-24 08:40:12

标签: 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

这里的相关图像是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),看看是否在任何地方都提到了一个存储库。

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

FROM buildpack-deps:stretch-scm

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

2 个答案:

答案 0 :(得分:3)

对于拉出的图像,我认为没有找到实际的dockerfile的方法就可以找到基础图像,因为拉出图像时,图像清单仅针对叶层下载。因此,非叶层的图像ID在<missing>中标记为docker history,您将不知道这些层的回购标签。


如果该映像是在您的计算机上构建的,但是如果您没有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
$ docker inspect 16a54299f91e
[
    {
        "Id": "sha256:16a54299f91ef62cf19d7329645365fff3b7a3bff4dfcd8d62f46d0c9845b9c6",
        "RepoTags": [
            "python:3.7-alpine"   ---> Base image used in FROM instruction. 

按照相反的顺序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$

答案 1 :(得分:0)

如果您使用的是 jfrog artifactory,则可以使用存储库服务器端信息来确定您是否使用了某个基础镜像。

即:

1 个基本映像具有清单、 sha__ 、 sha__ 、... 文件。文件编号为 n。

2 如果图像具有 (n-2) 个相同的 sha__ 文件名,则使用基础图像。

您可以浏览 jfrog artifactory UI,安装 jfrog atifactory cli 或 jfrog go client,使用搜索功能查找以上信息。