我很好奇我的图像基于什么基础图像。似乎没有简单直接的方法可以做到这一点。因此,例如,我想了解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
在我的命令输出中的任何地方都不可见?最重要的是,我想知道是否有更简单的方法来查找基本图像。
答案 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,使用搜索功能查找以上信息。