我很好奇我的图像基于什么基本图像。似乎没有简单直接的方法可以做到这一点。例如,我想知道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在我的命令输出中的任何地方都看不到?最重要的是,我想知道是否有更简单的方法来查找基本图像。
对于拉取的映像,我认为没有办法在不查看实际 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)
| 归档时间: |
|
| 查看次数: |
1844 次 |
| 最近记录: |