我很好奇我的图像是基于什么基础图像。似乎没有简单直接的方法可以做到这一点。例如,我想知道
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 hub 页面条目(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
所以问题是为什么
buildpack-deps:stretch-scm
在我的命令输出中的任何地方都不可见?最重要的是,我想知道是否有更简单的方法来找出基本图像。
对于拉取的图像,我认为没有办法在不查看实际的 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$
如果您正在使用 jfrog artifactory,则可以使用存储库服务器端信息来查明您是否正在使用某个基础映像。
即:
1 基础镜像有manifest、sha__、sha__、...文件。文件编号为n。
2 如果图像具有 (n-2) 个相同 sha__ 文件名,则使用基础图像。
您可以浏览jfrog artifactory UI,安装jfrog atifactory cli或jfrog go客户端,使用搜索功能查找以上信息。