Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何逐层调试docker pull?_Docker_Dockerfile - Fatal编程技术网

如何逐层调试docker pull?

如何逐层调试docker pull?,docker,dockerfile,Docker,Dockerfile,[情境]所以我们有了docker的形象。与所有其他图像一样,它由两层组成。一旦我们发现在docker pull image:v42中,两个特定的层需要很长时间才能下载,有时甚至会挂断几分钟 不知何故,我想调试并找出Dockerfile的哪一部分在这两个层中。执行docker history image id后,甚至通过使用,我发现层摘要与docker pull期间终端中显示的摘要完全不同。甚至层的大小也是不同的 [问题]有没有办法将这些“docker history”摘要与“docker pul

[情境]所以我们有了docker的形象。与所有其他图像一样,它由两层组成。一旦我们发现在docker pull image:v42中,两个特定的层需要很长时间才能下载,有时甚至会挂断几分钟

不知何故,我想调试并找出Dockerfile的哪一部分在这两个层中。执行
docker history image id
后,甚至通过使用,我发现层摘要与
docker pull期间终端中显示的摘要完全不同。甚至层的大小也是不同的

[问题]有没有办法将这些“docker history”摘要与“docker pull”摘要关联起来?或者,也就是说,我如何找出这些层中下载的内容

[p.s.]我想到的唯一可能有帮助的事情是注释掉整个Dockerfile,开始逐行取消注释,并用每一行新建一个图像。最后,我会在这些层面上绊倒。但一定有更好的办法。没有


更新(2020年9月12日| Docker 19.03.12):我们发现,在无根模式下运行Docker会使拉动时间加倍。i、 e.5GB镜像docker以根用户身份拉-->~4分钟。docker在无根模式下拉动-->~9-10分钟。大部分时间用于下载这两个层并提取所有层。

您可以尝试,这是一个docker层检查器。

您可以尝试,这是一个docker层检查器。

很难指定层速度慢的原因,而不仅仅是它们的大小。如果上游还有其他原因,那么从Cloudflare到Docker的主机(可能在类似AWS S3的存储桶中)会有很多移动部件,然后就是您的本地网络。对于非常频繁的使用,也有费率限制(这些限制将在未来几个月内对其他用户更加明显)。假设这只是一个大层,您可以直接从注册表中提取blob来检查它。这里有几个脚本可以使用curl访问注册表API:

$ cat manifest-v2.sh 
#!/bin/sh

ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
api="application/vnd.docker.distribution.manifest.v2+json"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
        | jq -r '.token')
curl -H "Accept: ${api}" \
     -H "Authorization: Bearer $token" \
     -s "https://registry-1.docker.io/v2/${repo}/manifests/${tag}" | jq .


$ cat get-blob.sh 
#!/bin/sh

ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
digest="$2"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
        | jq -r '.token')
curl -H "Authorization: Bearer $token" \
     -s -L -o - "https://registry-1.docker.io/v2/${repo}/blobs/${digest}"
然后运行这些,您可以看到您在拉取和下载特定层中看到的摘要,通过tar运行它,并查看该层中的内容:

$ ./manifest-v2.sh weberstephanhd/iacbox2:v380
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 36642,
    "digest": "sha256:4588fe154684dfe09b266e2a122b0789dc7ee89ff284fb140f14962fa2d5c754"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 26697127,
      "digest": "sha256:7595c8c21622ea8a8b9778972e26dbbe063f7a1c4b0a28a80a34ebb3d343b586"
    },
... lots of other layers ...
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 19899,
      "digest": "sha256:5350cb37a04f91a25c1e2f288310f58769cf77761c00e68059931ec3dcc67301"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 1364512,
      "digest": "sha256:476cd410766a5218a41bec1d3c772653ced6d5ad0cc14e52c303901da0255327"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 22698271,
      "digest": "sha256:1437ee729887a466d9d51b97321ce22f7f15c9340a622ce876f90cd7c0bc5952"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 17743524,
      "digest": "sha256:c7ed8287f08ff5f00a8c6a29afb9ceaa0bcf0e2fa0191f7bbb41aa8213ed55f6"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 5661386,
      "digest": "sha256:2e8965a34b4adf2d08f2cf12715ee40d1872c82ebda0fd1fb3711510b10ad07d"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 129,
      "digest": "sha256:6e71916e2b6e0112ea835e239c5770c1954f53c33d8dc80e0285af4b562a07e7"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 115,
      "digest": "sha256:b9677e754d0339eca6ffe9889d7d920f69efeb9987eb75308ee0479d11fa30cc"
    }
  ]
}

$ ./get-blob.sh weberstephanhd/iacbox2:v380 sha256:5350cb37a04f91a25c1e2f288310f58769cf77761c00e68059931ec3dcc67301 | tar -tzvf -
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/profile.d/
-rw-r--r-- root/root      1186 2020-09-04 07:49 etc/profile.d/iacbox-env.sh
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/skel/
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/skel/.azure/
-rwxr-xr-x root/root         0 1969-12-31 19:00 etc/skel/.azure/.wh..wh..opq
-rw-r--r-- root/root        25 2020-09-04 07:49 etc/skel/.azure/telemetry.json
-rw-r--r-- root/root       167 2020-09-04 07:49 etc/skel/.bash_aliases
-rw-r--r-- root/root       169 2020-09-04 07:49 etc/skel/.rvmrc
drwx------ root/root         0 2020-09-04 07:49 root/
drwxr-xr-x root/root         0 2020-09-04 07:49 root/.azure/
-rwxr-xr-x root/root         0 1969-12-31 19:00 root/.azure/.wh..wh..opq
-rw-r--r-- root/root        25 2020-09-04 07:49 root/.azure/telemetry.json
-rw-r--r-- root/root       167 2020-09-04 07:49 root/.bash_aliases
-rw-r--r-- root/root       169 2020-09-04 07:49 root/.rvmrc
drwxr-xr-x root/root         0 2020-09-04 07:49 root/.ssh/
-rwxr-xr-x root/root         0 1969-12-31 19:00 root/.ssh/.wh..wh..opq
-rw-r--r-- root/root        51 2020-09-04 07:49 root/.ssh/config
-rwxr-xr-x root/root      1249 2020-09-04 07:49 root/profile.d_iacbox-env.sh
drwxrwxrwt root/root         0 2020-09-04 07:49 tmp/
-rwxr-xr-x root/root      2288 2020-09-04 07:49 tmp/acceptance-test.sh
-rw------- root/root         0 2020-09-04 07:49 tmp/.wh.config_files
drwxr-xr-x root/root         0 2020-07-13 10:48 usr/
drwxr-xr-x root/root         0 2020-09-04 07:47 usr/local/
drwxr-xr-x 503/staff         0 2020-09-04 07:49 usr/local/bin/
lrwxrwxrwx root/root         0 2020-09-04 07:49 usr/local/bin/bosh2 -> /usr/local/bin/bosh
-rwxr-xr-x root/root     15672 2020-09-04 07:49 usr/local/bin/execute-iac-command.sh
-rwxr-xr-x root/root     16675 2020-09-04 07:49 usr/local/bin/iac-cmd.sh
-rwxr-xr-x root/root      1334 2020-09-04 07:49 usr/local/bin/iac-validate.sh
-rwxr-xr-x root/root      3850 2020-09-04 07:49 usr/local/bin/prepare_git_credentials.sh
-rwxr-xr-x root/root        47 2020-09-04 07:49 usr/local/bin/print-iaas-cli-environment.sh
-rwxr-xr-x root/root       111 2020-09-04 07:49 usr/local/bin/sshtunnel-to-landscape.sh
-rwxr-xr-x root/root     15700 2020-09-04 07:49 usr/local/bin/tunnel-to-landscape.sh
-rwxr-xr-x root/root       824 2020-09-04 07:49 usr/local/bin/whitelist-check-external-ips.sh
-rwxr-xr-x root/root       536 2020-09-04 07:49 usr/local/bin/whitelist-create-external-ips.sh
-rwxr-xr-x root/root       535 2020-09-04 07:49 usr/local/bin/whitelist-import-external-ips.sh
至于为什么消化液不同,这可以归结为压缩。这些blob的媒体类型是注册表上的压缩tar,但一旦下载到本地docker引擎,它就会解压缩层,本地摘要位于未压缩的tar上。这也解释了为什么尺寸不匹配

要将层与历史对齐,您可以将历史与清单进行比较,只需注意行的顺序(
docker history
显示的行与v1 registry API显示的行相反,而v2 API调用将显示从最早到最新的行),并且历史中并非每一行都会产生新的blob。如果您查看与图像关联的配置json,这一点会变得更加明显:

$ more get-config-v2.sh
#!/bin/sh

ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
        | jq -r '.token')
digest=$(curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
              -H "Authorization: Bearer $token" \
              -s "https://registry-1.docker.io/v2/${repo}/manifests/${tag}" \
         | jq -r .config.digest)
curl -H "Accept: application/vnd.docker.container.image.v1+json" \
     -H "Authorization: Bearer $token" \
     -s -L "https://registry-1.docker.io/v2/${repo}/blobs/${digest}" | jq .

$ ./get-config-v2.sh weberstephanhd/iacbox2:v380
{
  "architecture": "amd64",
  "config": {
    "Hostname": "",
    "Domainname": "",
    "User": "root",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/opt/ostoolset/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin",
      "CF_HOME=/root",
      "CF_PLUGIN_HOME=/usr/local/lib/cf_plugins",
      "TF_PLUGIN_DIR=/usr/local/lib/terraform_plugins",
      "GOROOT=/usr/local/go",
      "PYTHONWARNINGS=ignore:Certificate for :::",
      "OS_VOLUME_API_VERSION=2",
      "LANG=en_US.UTF-8",
      "LANGUAGE=en_US.UTF-8",
      "LC_ALL=en_US.UTF-8"
    ],
    "Cmd": [
      "/bin/bash"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:622904aeb073d26c0a17d87bf4df9cb026ffa99f1f5e9f3ff0fb6135e6aeb54e",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": null
  },
  "container": "af499c54916b436d2fee37da88a6e48ee1e1b218dece9747773396567cfcab23",
  "container_config": {
    "Hostname": "af499c54916b",
    "Domainname": "",
    "User": "root",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/opt/ostoolset/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin",
      "CF_HOME=/root",
      "CF_PLUGIN_HOME=/usr/local/lib/cf_plugins",
      "TF_PLUGIN_DIR=/usr/local/lib/terraform_plugins",
      "GOROOT=/usr/local/go",
      "PYTHONWARNINGS=ignore:Certificate for :::",
      "OS_VOLUME_API_VERSION=2",
      "LANG=en_US.UTF-8",
      "LANGUAGE=en_US.UTF-8",
      "LC_ALL=en_US.UTF-8"
    ],
    "Cmd": [
      "/bin/sh",
      "-c",
      "#(nop) ",
      "USER root"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:622904aeb073d26c0a17d87bf4df9cb026ffa99f1f5e9f3ff0fb6135e6aeb54e",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {}
  },
  "created": "2020-09-04T11:49:53.021161021Z",
  "docker_version": "19.03.6",
  "history": [
    {
      "created": "2020-07-24T14:38:19.482143079Z",
      "created_by": "/bin/sh -c #(nop) ADD file:7d9bbf45a5b2510d44d3206a028cf6502757884d49e46d3d2e6356c3a92c4309 in / "
    },
    {
      "created": "2020-07-24T14:38:20.335965442Z",
      "created_by": "/bin/sh -c [ -z \"$(apt-get indextargets)\" ]"
    },
    {
      "created": "2020-07-24T14:38:21.071294363Z",
      "created_by": "/bin/sh -c set -xe \t\t&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \t&& echo 'exit 101' >> /usr/sbin/policy-rc.d \t&& chmod +x /usr/sbin/policy-rc.d \t\t&& dpkg-divert --local --rename --add /sbin/initctl \t&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \t&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \t\t&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \t\t&& echo 'DPkg::Post-Invoke { \"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true\"; };' > /etc/apt/apt.conf.d/docker-clean \t&& echo 'APT::Update::Post-Invoke { \"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true\"; };' >> /etc/apt/apt.conf.d/docker-clean \t&& echo 'Dir::Cache::pkgcache \"\"; Dir::Cache::srcpkgcache \"\";' >> /etc/apt/apt.conf.d/docker-clean \t\t&& echo 'Acquire::Languages \"none\";' > /etc/apt/apt.conf.d/docker-no-languages \t\t&& echo 'Acquire::GzipIndexes \"true\"; Acquire::CompressionTypes::Order:: \"gz\";' > /etc/apt/apt.conf.d/docker-gzip-indexes \t\t&& echo 'Apt::AutoRemove::SuggestsImportant \"false\";' > /etc/apt/apt.conf.d/docker-autoremove-suggests"
    },
    {
      "created": "2020-07-24T14:38:21.85928744Z",
      "created_by": "/bin/sh -c mkdir -p /run/systemd && echo 'docker' > /run/systemd/container"
    },
    {
      "created": "2020-07-24T14:38:22.027273323Z",
      "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/bash\"]",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.397707805Z",
      "created_by": "/bin/sh -c #(nop)  ENV CF_HOME=/root",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.50996911Z",
      "created_by": "/bin/sh -c #(nop)  ENV CF_PLUGIN_HOME=/usr/local/lib/cf_plugins",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.613680523Z",
      "created_by": "/bin/sh -c #(nop)  ENV TF_PLUGIN_DIR=/usr/local/lib/terraform_plugins",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.716721682Z",
      "created_by": "/bin/sh -c #(nop)  ENV GOROOT=/usr/local/go",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.819392564Z",
      "created_by": "/bin/sh -c #(nop)  ENV PATH=/opt/ostoolset/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.92341478Z",
      "created_by": "/bin/sh -c #(nop)  ENV PYTHONWARNINGS=ignore:Certificate for :::",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:29.024894545Z",
      "created_by": "/bin/sh -c #(nop)  ENV OS_VOLUME_API_VERSION=2",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:29.618098106Z",
      "created_by": "/bin/sh -c rm /bin/sh && ln -sf /bin/bash /bin/sh"
    },
    {
      "created": "2020-08-27T04:23:40.330900434Z",
      "created_by": "/bin/sh -c apt-get update &&     DEBIAN_FRONTEND=noninteractive     apt-get install -y     apt-utils     apt-transport-https     gnupg2     curl     wget     locales &&     rm -rf /var/lib/apt/lists/*"
    },
    {
      "created": "2020-08-27T04:23:41.633234144Z",
      "created_by": "/bin/sh -c locale-gen \"en_US.UTF-8\""
    },
    {
      "created": "2020-08-27T04:23:41.742325545Z",
      "created_by": "/bin/sh -c #(nop)  ENV LANG=en_US.UTF-8",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:41.845327099Z",
      "created_by": "/bin/sh -c #(nop)  ENV LANGUAGE=en_US.UTF-8",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:41.954629412Z",
      "created_by": "/bin/sh -c #(nop)  ENV LC_ALL=en_US.UTF-8",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:42.08703115Z",
      "created_by": "/bin/sh -c #(nop) COPY file:298c66e94d89d7e189c54b0e79c24ac300dd4f3524469d0d8adcf16d5f3f5776 in /etc/apt/sources.list.d/extended.list "
    },
    {
      "created": "2020-08-27T04:23:45.007887008Z",
      "created_by": "/bin/sh -c curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - &&     curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - &&     curl -L https://packages.microsoft.com/keys/microsoft.asc | apt-key add - &&     curl -sSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - &&     curl -sSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - &&     mkdir -p \"/usr/local/share/ca-certificates/sap.com\" \"/usr/local/share/ca-certificates/verizon\" &&     curl -sSL http://aia.pki.co.sap.com/aia/SAPNetCA_G2.crt -o \"/usr/local/share/ca-certificates/sap.com/SAPNetCA_G2.crt\" &&     curl -sSL http://aia.pki.co.sap.com/aia/SAP%20Global%20Root%20CA.crt -o \"/usr/local/share/ca-certificates/sap.com/SAP_Global_Root_CA.crt\" &&     curl -sSL https://de.ssl-tools.net/certificates/f326e9f894088fb560a001aa2c0ea8b1c20e6c35.pem -o \"/usr/local/share/ca-certificates/verizon/Verizon_Public_SureServer_CA_G14-SHA2.crt\" &&     update-ca-certificates"
    },
    {
      "created": "2020-08-27T04:23:45.871796489Z",
      "created_by": "/bin/sh -c wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -"
    },
    {
      "created": "2020-08-27T04:23:46.464366636Z",
      "created_by": "/bin/sh -c echo \"deb http://apt.postgresql.org/pub/repos/apt/ bionic\"-pgdg main | tee  /etc/apt/sources.list.d/pgdg.list"
    },
... bunch of history trimmed ...
    {
      "created": "2020-09-04T11:49:51.582086565Z",
      "created_by": "|17 TF_BIN_RELEASE_URL_PREFIX=https://releases.hashicorp.com/terraform TF_PROVIDER_VERSION_ALI=1.70.0 TF_PROVIDER_VERSION_ARCHIVE=1.2.2 TF_PROVIDER_VERSION_AWS=2.70.0 TF_PROVIDER_VERSION_AZURE=2.17.0 TF_PROVIDER_VERSION_AZUREAD=0.10.0 TF_PROVIDER_VERSION_AZURE_LEGACY=1.44.0 TF_PROVIDER_VERSION_DNS=2.1.1 TF_PROVIDER_VERSION_GOOGLE=3.15.0 TF_PROVIDER_VERSION_LOCAL=1.4.0 TF_PROVIDER_VERSION_NULL=2.1.2 TF_PROVIDER_VERSION_OPEN_STACK=1.20.0 TF_PROVIDER_VERSION_POSTGRESQL=1.1.0 TF_PROVIDER_VERSION_RANDOM=2.3.0 TF_PROVIDER_VERSION_TEMPLATE=2.1.2 TF_VERSION=0.12.28 VAULT_VERSION=1.4.2 /bin/sh -c cp /root/go/bin/ossutil /usr/local/bin"
    },
    {
      "created": "2020-09-04T11:49:51.726671638Z",
      "created_by": "/bin/sh -c #(nop)  ARG VERSION=latest",
      "empty_layer": true
    },
    {
      "created": "2020-09-04T11:49:52.311382499Z",
      "created_by": "|18 TF_BIN_RELEASE_URL_PREFIX=https://releases.hashicorp.com/terraform TF_PROVIDER_VERSION_ALI=1.70.0 TF_PROVIDER_VERSION_ARCHIVE=1.2.2 TF_PROVIDER_VERSION_AWS=2.70.0 TF_PROVIDER_VERSION_AZURE=2.17.0 TF_PROVIDER_VERSION_AZUREAD=0.10.0 TF_PROVIDER_VERSION_AZURE_LEGACY=1.44.0 TF_PROVIDER_VERSION_DNS=2.1.1 TF_PROVIDER_VERSION_GOOGLE=3.15.0 TF_PROVIDER_VERSION_LOCAL=1.4.0 TF_PROVIDER_VERSION_NULL=2.1.2 TF_PROVIDER_VERSION_OPEN_STACK=1.20.0 TF_PROVIDER_VERSION_POSTGRESQL=1.1.0 TF_PROVIDER_VERSION_RANDOM=2.3.0 TF_PROVIDER_VERSION_TEMPLATE=2.1.2 TF_VERSION=0.12.28 VAULT_VERSION=1.4.2 VERSION=v380 /bin/sh -c echo ${VERSION} > /docker_image_version"
    },
    {
      "created": "2020-09-04T11:49:52.91091882Z",
      "created_by": "|18 TF_BIN_RELEASE_URL_PREFIX=https://releases.hashicorp.com/terraform TF_PROVIDER_VERSION_ALI=1.70.0 TF_PROVIDER_VERSION_ARCHIVE=1.2.2 TF_PROVIDER_VERSION_AWS=2.70.0 TF_PROVIDER_VERSION_AZURE=2.17.0 TF_PROVIDER_VERSION_AZUREAD=0.10.0 TF_PROVIDER_VERSION_AZURE_LEGACY=1.44.0 TF_PROVIDER_VERSION_DNS=2.1.1 TF_PROVIDER_VERSION_GOOGLE=3.15.0 TF_PROVIDER_VERSION_LOCAL=1.4.0 TF_PROVIDER_VERSION_NULL=2.1.2 TF_PROVIDER_VERSION_OPEN_STACK=1.20.0 TF_PROVIDER_VERSION_POSTGRESQL=1.1.0 TF_PROVIDER_VERSION_RANDOM=2.3.0 TF_PROVIDER_VERSION_TEMPLATE=2.1.2 TF_VERSION=0.12.28 VAULT_VERSION=1.4.2 VERSION=v380 /bin/sh -c echo migrated > /migrated"
    },
    {
      "created": "2020-09-04T11:49:53.021161021Z",
      "created_by": "/bin/sh -c #(nop)  USER root",
      "empty_layer": true
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:7ef3687765828a9cb2645925f27febbac21a5adece69e8437c26184a897b6ec7",
      "sha256:83f4287e1f0496940f8c222ca09cbaf2c7f564a10c57b4609800babe8d1b5b32",
      "sha256:d3a6da143c913c5e605737a9d974638f75451b5c593e58eb7e132fcf0e23c6db",
      "sha256:8682f9a74649fb9fc5d14f827a35259aae8b58c57df8d369f6aa2e92865930c2",
      "sha256:6fd2b828f15530b3e91fdc47694d1165a90a2e33edce9c30961a1fb0c92f2d51",
      "sha256:c41b334c1d5f7c94942e7b6372d5c18f43e8840eb12d7683f6b45856d2776d1a",
      "sha256:a180f973b01e39cd5eb3fc04222d06be573eb308e5a096157c3a9c5c523e3e0c",
      "sha256:424841a53760a9261eb7b4d3dd7c70b62bc74525a13412d0dbbca8deea4255d3",
      "sha256:198605a838ddf053e6120869caebef0272b725c354a42a1d20beeaf8e02674c0",
      "sha256:487242c09dbb7034f6f38585f74f28255d0a574c3db706c830e8408d2436b2fe",
      "sha256:68b89d709fcb495c984b811f195c86dc36831f2cd4f95f38a26fed3baa4e2c5e",
      "sha256:877656568034f2328abd9d73036463d160b0da912ace2535e5c13a75c893413f",
      "sha256:70f7e4f7c12ea90fda9f0442bbb4e6ea7bae448b56d8b6c83c365adb09254367",
      "sha256:0576dc0190175293ca7cbba2a6ea93957db46458246da26f1434b432d66173db",
      "sha256:218cf40a20bbf60704152566772bc0bf803374c594e47261f05ab2b207f497fb",
      "sha256:f5845a9ea4efd834b747a109209d46b6dcb5e05e88a27df67de4aba03dd92f18",
      "sha256:000cddfa5fea51b517db796168add34b9648955dfa6421c8c158709d9687cb32",
      "sha256:4bd3750abf95ceb7d4e6c8f47acdc1c9db754325e050776186ae0a681e032fcd",
      "sha256:810c4b2cb213baf64895dec8566410e7b401436bf524c33d55893a45748c1bba",
      "sha256:5dcb620bac21a7449919d730e5e7ed23f9a0d791f72d3709b5cf3e81853adcd1",
      "sha256:09af1a244f314fe3558afa8d42e66ac376a18bf010544ba4872f3fe7461d1382",
      "sha256:c16ddbd687d181a095ca3ec8b108cf0d27a7a5408cc6e5073c03c903fbd344d3",
      "sha256:8b77549540c08a2571a7d7e8d11cc59519f36b613c0e1ef3c5d713d39f4e3507",
      "sha256:01079aef52a4ee46973ddd207c40f7b1ff4688216a5a05bfb37feea2041fc214",
      "sha256:2e43dfce6411894ef682d3ba313021264700033b0789f826b1304c8874695bc9",
      "sha256:616a5dfd09e5305cc271f77727a84d0c28628c758a994df65df75c33444ea42a",
      "sha256:8c9c8ab8442e9a7e3094090ac8d6659acb050d477d306841cea37eef4a379eed",
      "sha256:047be9dbcd6162c17cdfaee5380611072e27fb7b3de1c462d01d63f436b04f44",
      "sha256:8d25d3692cf4d95dca0327da7d8632c27cbdee71110a9c78628eba94fdc04e6d",
      "sha256:b21e2e4a55c8861e36503e6bb7385968e7db49247e07772927c3baf5c06336de",
      "sha256:ab0696412395709d6a71e21bba15cc474a52a34798149cee761d3accbb896296",
      "sha256:c81651668c205be10467a540129bd91eca20711f22b929a94839f780b1ff0d3f",
      "sha256:57cdc9e21eff8e78820f5222b3e21a06808564aa19884fa3003b12f58b325c7f",
      "sha256:18d72968405bb4ea92c826a718b080cc8b2f0d310f9c791af0bcf6cfd4e9dfc7",
      "sha256:1efa41d22392b374475e2472d0f6c710498052330f5c218296fbf327303d4890",
      "sha256:dd2dd93244de62000c96955f424a55699c6458d64932e4b170e0c42d095b3bc0",
      "sha256:432d521b81b9bcaef07786922cc16581cc6f008ea2bea79fd39d01a496814599"
    ]
  }
}
在这里,您将看到
“empty_layer”:true
,这表明Dockerfile的步骤只对
config.json
进行了更改,而没有创建新的文件系统层。因此,如果小心,可以计算历史记录和清单中的层,以确定哪个历史记录命令导致了哪个层/blob


另外,看看这些层中的命令历史记录,我认为一些较大的层是因为地形,二进制文件和插件不是很小(我在过去尝试制作一个快速provisioner容器时,发现我的图像通常比我想要的要大).

除了尺寸之外,很难指定图层速度慢的原因。如果上游还有其他原因,那么从Cloudflare到Docker的主机(可能在类似AWS S3的存储桶中)会有很多移动部件,然后就是您的本地网络。对于非常频繁的使用,也有费率限制(这些限制将在未来几个月内对其他用户更加明显)。假设这只是一个大层,您可以直接从注册表中提取blob来检查它。这里有几个脚本可以使用curl访问注册表API:

$ cat manifest-v2.sh 
#!/bin/sh

ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
api="application/vnd.docker.distribution.manifest.v2+json"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
        | jq -r '.token')
curl -H "Accept: ${api}" \
     -H "Authorization: Bearer $token" \
     -s "https://registry-1.docker.io/v2/${repo}/manifests/${tag}" | jq .


$ cat get-blob.sh 
#!/bin/sh

ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
digest="$2"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
        | jq -r '.token')
curl -H "Authorization: Bearer $token" \
     -s -L -o - "https://registry-1.docker.io/v2/${repo}/blobs/${digest}"
然后运行这些,您可以看到您在拉取和下载特定层中看到的摘要,通过tar运行它,并查看该层中的内容:

$ ./manifest-v2.sh weberstephanhd/iacbox2:v380
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 36642,
    "digest": "sha256:4588fe154684dfe09b266e2a122b0789dc7ee89ff284fb140f14962fa2d5c754"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 26697127,
      "digest": "sha256:7595c8c21622ea8a8b9778972e26dbbe063f7a1c4b0a28a80a34ebb3d343b586"
    },
... lots of other layers ...
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 19899,
      "digest": "sha256:5350cb37a04f91a25c1e2f288310f58769cf77761c00e68059931ec3dcc67301"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 1364512,
      "digest": "sha256:476cd410766a5218a41bec1d3c772653ced6d5ad0cc14e52c303901da0255327"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 22698271,
      "digest": "sha256:1437ee729887a466d9d51b97321ce22f7f15c9340a622ce876f90cd7c0bc5952"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 17743524,
      "digest": "sha256:c7ed8287f08ff5f00a8c6a29afb9ceaa0bcf0e2fa0191f7bbb41aa8213ed55f6"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 5661386,
      "digest": "sha256:2e8965a34b4adf2d08f2cf12715ee40d1872c82ebda0fd1fb3711510b10ad07d"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 129,
      "digest": "sha256:6e71916e2b6e0112ea835e239c5770c1954f53c33d8dc80e0285af4b562a07e7"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 115,
      "digest": "sha256:b9677e754d0339eca6ffe9889d7d920f69efeb9987eb75308ee0479d11fa30cc"
    }
  ]
}

$ ./get-blob.sh weberstephanhd/iacbox2:v380 sha256:5350cb37a04f91a25c1e2f288310f58769cf77761c00e68059931ec3dcc67301 | tar -tzvf -
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/profile.d/
-rw-r--r-- root/root      1186 2020-09-04 07:49 etc/profile.d/iacbox-env.sh
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/skel/
drwxr-xr-x root/root         0 2020-09-04 07:49 etc/skel/.azure/
-rwxr-xr-x root/root         0 1969-12-31 19:00 etc/skel/.azure/.wh..wh..opq
-rw-r--r-- root/root        25 2020-09-04 07:49 etc/skel/.azure/telemetry.json
-rw-r--r-- root/root       167 2020-09-04 07:49 etc/skel/.bash_aliases
-rw-r--r-- root/root       169 2020-09-04 07:49 etc/skel/.rvmrc
drwx------ root/root         0 2020-09-04 07:49 root/
drwxr-xr-x root/root         0 2020-09-04 07:49 root/.azure/
-rwxr-xr-x root/root         0 1969-12-31 19:00 root/.azure/.wh..wh..opq
-rw-r--r-- root/root        25 2020-09-04 07:49 root/.azure/telemetry.json
-rw-r--r-- root/root       167 2020-09-04 07:49 root/.bash_aliases
-rw-r--r-- root/root       169 2020-09-04 07:49 root/.rvmrc
drwxr-xr-x root/root         0 2020-09-04 07:49 root/.ssh/
-rwxr-xr-x root/root         0 1969-12-31 19:00 root/.ssh/.wh..wh..opq
-rw-r--r-- root/root        51 2020-09-04 07:49 root/.ssh/config
-rwxr-xr-x root/root      1249 2020-09-04 07:49 root/profile.d_iacbox-env.sh
drwxrwxrwt root/root         0 2020-09-04 07:49 tmp/
-rwxr-xr-x root/root      2288 2020-09-04 07:49 tmp/acceptance-test.sh
-rw------- root/root         0 2020-09-04 07:49 tmp/.wh.config_files
drwxr-xr-x root/root         0 2020-07-13 10:48 usr/
drwxr-xr-x root/root         0 2020-09-04 07:47 usr/local/
drwxr-xr-x 503/staff         0 2020-09-04 07:49 usr/local/bin/
lrwxrwxrwx root/root         0 2020-09-04 07:49 usr/local/bin/bosh2 -> /usr/local/bin/bosh
-rwxr-xr-x root/root     15672 2020-09-04 07:49 usr/local/bin/execute-iac-command.sh
-rwxr-xr-x root/root     16675 2020-09-04 07:49 usr/local/bin/iac-cmd.sh
-rwxr-xr-x root/root      1334 2020-09-04 07:49 usr/local/bin/iac-validate.sh
-rwxr-xr-x root/root      3850 2020-09-04 07:49 usr/local/bin/prepare_git_credentials.sh
-rwxr-xr-x root/root        47 2020-09-04 07:49 usr/local/bin/print-iaas-cli-environment.sh
-rwxr-xr-x root/root       111 2020-09-04 07:49 usr/local/bin/sshtunnel-to-landscape.sh
-rwxr-xr-x root/root     15700 2020-09-04 07:49 usr/local/bin/tunnel-to-landscape.sh
-rwxr-xr-x root/root       824 2020-09-04 07:49 usr/local/bin/whitelist-check-external-ips.sh
-rwxr-xr-x root/root       536 2020-09-04 07:49 usr/local/bin/whitelist-create-external-ips.sh
-rwxr-xr-x root/root       535 2020-09-04 07:49 usr/local/bin/whitelist-import-external-ips.sh
至于为什么消化液不同,这可以归结为压缩。这些blob的媒体类型是注册表上的压缩tar,但一旦下载到本地docker引擎,它就会解压缩层,本地摘要位于未压缩的tar上。这也解释了为什么尺寸不匹配

要将层与历史对齐,您可以将历史与清单进行比较,只需注意行的顺序(
docker history
显示的行与v1 registry API显示的行相反,而v2 API调用将显示从最早到最新的行),并且历史中并非每一行都会产生新的blob。如果您查看与图像关联的配置json,这一点会变得更加明显:

$ more get-config-v2.sh
#!/bin/sh

ref="${1:-library/ubuntu:latest}"
repo="${ref%:*}"
tag="${ref##*:}"
token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \
        | jq -r '.token')
digest=$(curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
              -H "Authorization: Bearer $token" \
              -s "https://registry-1.docker.io/v2/${repo}/manifests/${tag}" \
         | jq -r .config.digest)
curl -H "Accept: application/vnd.docker.container.image.v1+json" \
     -H "Authorization: Bearer $token" \
     -s -L "https://registry-1.docker.io/v2/${repo}/blobs/${digest}" | jq .

$ ./get-config-v2.sh weberstephanhd/iacbox2:v380
{
  "architecture": "amd64",
  "config": {
    "Hostname": "",
    "Domainname": "",
    "User": "root",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/opt/ostoolset/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin",
      "CF_HOME=/root",
      "CF_PLUGIN_HOME=/usr/local/lib/cf_plugins",
      "TF_PLUGIN_DIR=/usr/local/lib/terraform_plugins",
      "GOROOT=/usr/local/go",
      "PYTHONWARNINGS=ignore:Certificate for :::",
      "OS_VOLUME_API_VERSION=2",
      "LANG=en_US.UTF-8",
      "LANGUAGE=en_US.UTF-8",
      "LC_ALL=en_US.UTF-8"
    ],
    "Cmd": [
      "/bin/bash"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:622904aeb073d26c0a17d87bf4df9cb026ffa99f1f5e9f3ff0fb6135e6aeb54e",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": null
  },
  "container": "af499c54916b436d2fee37da88a6e48ee1e1b218dece9747773396567cfcab23",
  "container_config": {
    "Hostname": "af499c54916b",
    "Domainname": "",
    "User": "root",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/opt/ostoolset/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin",
      "CF_HOME=/root",
      "CF_PLUGIN_HOME=/usr/local/lib/cf_plugins",
      "TF_PLUGIN_DIR=/usr/local/lib/terraform_plugins",
      "GOROOT=/usr/local/go",
      "PYTHONWARNINGS=ignore:Certificate for :::",
      "OS_VOLUME_API_VERSION=2",
      "LANG=en_US.UTF-8",
      "LANGUAGE=en_US.UTF-8",
      "LC_ALL=en_US.UTF-8"
    ],
    "Cmd": [
      "/bin/sh",
      "-c",
      "#(nop) ",
      "USER root"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:622904aeb073d26c0a17d87bf4df9cb026ffa99f1f5e9f3ff0fb6135e6aeb54e",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {}
  },
  "created": "2020-09-04T11:49:53.021161021Z",
  "docker_version": "19.03.6",
  "history": [
    {
      "created": "2020-07-24T14:38:19.482143079Z",
      "created_by": "/bin/sh -c #(nop) ADD file:7d9bbf45a5b2510d44d3206a028cf6502757884d49e46d3d2e6356c3a92c4309 in / "
    },
    {
      "created": "2020-07-24T14:38:20.335965442Z",
      "created_by": "/bin/sh -c [ -z \"$(apt-get indextargets)\" ]"
    },
    {
      "created": "2020-07-24T14:38:21.071294363Z",
      "created_by": "/bin/sh -c set -xe \t\t&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \t&& echo 'exit 101' >> /usr/sbin/policy-rc.d \t&& chmod +x /usr/sbin/policy-rc.d \t\t&& dpkg-divert --local --rename --add /sbin/initctl \t&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \t&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \t\t&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \t\t&& echo 'DPkg::Post-Invoke { \"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true\"; };' > /etc/apt/apt.conf.d/docker-clean \t&& echo 'APT::Update::Post-Invoke { \"rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true\"; };' >> /etc/apt/apt.conf.d/docker-clean \t&& echo 'Dir::Cache::pkgcache \"\"; Dir::Cache::srcpkgcache \"\";' >> /etc/apt/apt.conf.d/docker-clean \t\t&& echo 'Acquire::Languages \"none\";' > /etc/apt/apt.conf.d/docker-no-languages \t\t&& echo 'Acquire::GzipIndexes \"true\"; Acquire::CompressionTypes::Order:: \"gz\";' > /etc/apt/apt.conf.d/docker-gzip-indexes \t\t&& echo 'Apt::AutoRemove::SuggestsImportant \"false\";' > /etc/apt/apt.conf.d/docker-autoremove-suggests"
    },
    {
      "created": "2020-07-24T14:38:21.85928744Z",
      "created_by": "/bin/sh -c mkdir -p /run/systemd && echo 'docker' > /run/systemd/container"
    },
    {
      "created": "2020-07-24T14:38:22.027273323Z",
      "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/bash\"]",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.397707805Z",
      "created_by": "/bin/sh -c #(nop)  ENV CF_HOME=/root",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.50996911Z",
      "created_by": "/bin/sh -c #(nop)  ENV CF_PLUGIN_HOME=/usr/local/lib/cf_plugins",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.613680523Z",
      "created_by": "/bin/sh -c #(nop)  ENV TF_PLUGIN_DIR=/usr/local/lib/terraform_plugins",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.716721682Z",
      "created_by": "/bin/sh -c #(nop)  ENV GOROOT=/usr/local/go",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.819392564Z",
      "created_by": "/bin/sh -c #(nop)  ENV PATH=/opt/ostoolset/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:28.92341478Z",
      "created_by": "/bin/sh -c #(nop)  ENV PYTHONWARNINGS=ignore:Certificate for :::",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:29.024894545Z",
      "created_by": "/bin/sh -c #(nop)  ENV OS_VOLUME_API_VERSION=2",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:29.618098106Z",
      "created_by": "/bin/sh -c rm /bin/sh && ln -sf /bin/bash /bin/sh"
    },
    {
      "created": "2020-08-27T04:23:40.330900434Z",
      "created_by": "/bin/sh -c apt-get update &&     DEBIAN_FRONTEND=noninteractive     apt-get install -y     apt-utils     apt-transport-https     gnupg2     curl     wget     locales &&     rm -rf /var/lib/apt/lists/*"
    },
    {
      "created": "2020-08-27T04:23:41.633234144Z",
      "created_by": "/bin/sh -c locale-gen \"en_US.UTF-8\""
    },
    {
      "created": "2020-08-27T04:23:41.742325545Z",
      "created_by": "/bin/sh -c #(nop)  ENV LANG=en_US.UTF-8",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:41.845327099Z",
      "created_by": "/bin/sh -c #(nop)  ENV LANGUAGE=en_US.UTF-8",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:41.954629412Z",
      "created_by": "/bin/sh -c #(nop)  ENV LC_ALL=en_US.UTF-8",
      "empty_layer": true
    },
    {
      "created": "2020-08-27T04:23:42.08703115Z",
      "created_by": "/bin/sh -c #(nop) COPY file:298c66e94d89d7e189c54b0e79c24ac300dd4f3524469d0d8adcf16d5f3f5776 in /etc/apt/sources.list.d/extended.list "
    },
    {
      "created": "2020-08-27T04:23:45.007887008Z",
      "created_by": "/bin/sh -c curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - &&     curl -sSL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - &&     curl -L https://packages.microsoft.com/keys/microsoft.asc | apt-key add - &&     curl -sSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - &&     curl -sSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - &&     mkdir -p \"/usr/local/share/ca-certificates/sap.com\" \"/usr/local/share/ca-certificates/verizon\" &&     curl -sSL http://aia.pki.co.sap.com/aia/SAPNetCA_G2.crt -o \"/usr/local/share/ca-certificates/sap.com/SAPNetCA_G2.crt\" &&     curl -sSL http://aia.pki.co.sap.com/aia/SAP%20Global%20Root%20CA.crt -o \"/usr/local/share/ca-certificates/sap.com/SAP_Global_Root_CA.crt\" &&     curl -sSL https://de.ssl-tools.net/certificates/f326e9f894088fb560a001aa2c0ea8b1c20e6c35.pem -o \"/usr/local/share/ca-certificates/verizon/Verizon_Public_SureServer_CA_G14-SHA2.crt\" &&     update-ca-certificates"
    },
    {
      "created": "2020-08-27T04:23:45.871796489Z",
      "created_by": "/bin/sh -c wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -"
    },
    {
      "created": "2020-08-27T04:23:46.464366636Z",
      "created_by": "/bin/sh -c echo \"deb http://apt.postgresql.org/pub/repos/apt/ bionic\"-pgdg main | tee  /etc/apt/sources.list.d/pgdg.list"
    },
... bunch of history trimmed ...
    {
      "created": "2020-09-04T11:49:51.582086565Z",
      "created_by": "|17 TF_BIN_RELEASE_URL_PREFIX=https://releases.hashicorp.com/terraform TF_PROVIDER_VERSION_ALI=1.70.0 TF_PROVIDER_VERSION_ARCHIVE=1.2.2 TF_PROVIDER_VERSION_AWS=2.70.0 TF_PROVIDER_VERSION_AZURE=2.17.0 TF_PROVIDER_VERSION_AZUREAD=0.10.0 TF_PROVIDER_VERSION_AZURE_LEGACY=1.44.0 TF_PROVIDER_VERSION_DNS=2.1.1 TF_PROVIDER_VERSION_GOOGLE=3.15.0 TF_PROVIDER_VERSION_LOCAL=1.4.0 TF_PROVIDER_VERSION_NULL=2.1.2 TF_PROVIDER_VERSION_OPEN_STACK=1.20.0 TF_PROVIDER_VERSION_POSTGRESQL=1.1.0 TF_PROVIDER_VERSION_RANDOM=2.3.0 TF_PROVIDER_VERSION_TEMPLATE=2.1.2 TF_VERSION=0.12.28 VAULT_VERSION=1.4.2 /bin/sh -c cp /root/go/bin/ossutil /usr/local/bin"
    },
    {
      "created": "2020-09-04T11:49:51.726671638Z",
      "created_by": "/bin/sh -c #(nop)  ARG VERSION=latest",
      "empty_layer": true
    },
    {
      "created": "2020-09-04T11:49:52.311382499Z",
      "created_by": "|18 TF_BIN_RELEASE_URL_PREFIX=https://releases.hashicorp.com/terraform TF_PROVIDER_VERSION_ALI=1.70.0 TF_PROVIDER_VERSION_ARCHIVE=1.2.2 TF_PROVIDER_VERSION_AWS=2.70.0 TF_PROVIDER_VERSION_AZURE=2.17.0 TF_PROVIDER_VERSION_AZUREAD=0.10.0 TF_PROVIDER_VERSION_AZURE_LEGACY=1.44.0 TF_PROVIDER_VERSION_DNS=2.1.1 TF_PROVIDER_VERSION_GOOGLE=3.15.0 TF_PROVIDER_VERSION_LOCAL=1.4.0 TF_PROVIDER_VERSION_NULL=2.1.2 TF_PROVIDER_VERSION_OPEN_STACK=1.20.0 TF_PROVIDER_VERSION_POSTGRESQL=1.1.0 TF_PROVIDER_VERSION_RANDOM=2.3.0 TF_PROVIDER_VERSION_TEMPLATE=2.1.2 TF_VERSION=0.12.28 VAULT_VERSION=1.4.2 VERSION=v380 /bin/sh -c echo ${VERSION} > /docker_image_version"
    },
    {
      "created": "2020-09-04T11:49:52.91091882Z",
      "created_by": "|18 TF_BIN_RELEASE_URL_PREFIX=https://releases.hashicorp.com/terraform TF_PROVIDER_VERSION_ALI=1.70.0 TF_PROVIDER_VERSION_ARCHIVE=1.2.2 TF_PROVIDER_VERSION_AWS=2.70.0 TF_PROVIDER_VERSION_AZURE=2.17.0 TF_PROVIDER_VERSION_AZUREAD=0.10.0 TF_PROVIDER_VERSION_AZURE_LEGACY=1.44.0 TF_PROVIDER_VERSION_DNS=2.1.1 TF_PROVIDER_VERSION_GOOGLE=3.15.0 TF_PROVIDER_VERSION_LOCAL=1.4.0 TF_PROVIDER_VERSION_NULL=2.1.2 TF_PROVIDER_VERSION_OPEN_STACK=1.20.0 TF_PROVIDER_VERSION_POSTGRESQL=1.1.0 TF_PROVIDER_VERSION_RANDOM=2.3.0 TF_PROVIDER_VERSION_TEMPLATE=2.1.2 TF_VERSION=0.12.28 VAULT_VERSION=1.4.2 VERSION=v380 /bin/sh -c echo migrated > /migrated"
    },
    {
      "created": "2020-09-04T11:49:53.021161021Z",
      "created_by": "/bin/sh -c #(nop)  USER root",
      "empty_layer": true
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:7ef3687765828a9cb2645925f27febbac21a5adece69e8437c26184a897b6ec7",
      "sha256:83f4287e1f0496940f8c222ca09cbaf2c7f564a10c57b4609800babe8d1b5b32",
      "sha256:d3a6da143c913c5e605737a9d974638f75451b5c593e58eb7e132fcf0e23c6db",
      "sha256:8682f9a74649fb9fc5d14f827a35259aae8b58c57df8d369f6aa2e92865930c2",
      "sha256:6fd2b828f15530b3e91fdc47694d1165a90a2e33edce9c30961a1fb0c92f2d51",
      "sha256:c41b334c1d5f7c94942e7b6372d5c18f43e8840eb12d7683f6b45856d2776d1a",
      "sha256:a180f973b01e39cd5eb3fc04222d06be573eb308e5a096157c3a9c5c523e3e0c",
      "sha256:424841a53760a9261eb7b4d3dd7c70b62bc74525a13412d0dbbca8deea4255d3",
      "sha256:198605a838ddf053e6120869caebef0272b725c354a42a1d20beeaf8e02674c0",
      "sha256:487242c09dbb7034f6f38585f74f28255d0a574c3db706c830e8408d2436b2fe",
      "sha256:68b89d709fcb495c984b811f195c86dc36831f2cd4f95f38a26fed3baa4e2c5e",
      "sha256:877656568034f2328abd9d73036463d160b0da912ace2535e5c13a75c893413f",
      "sha256:70f7e4f7c12ea90fda9f0442bbb4e6ea7bae448b56d8b6c83c365adb09254367",
      "sha256:0576dc0190175293ca7cbba2a6ea93957db46458246da26f1434b432d66173db",
      "sha256:218cf40a20bbf60704152566772bc0bf803374c594e47261f05ab2b207f497fb",
      "sha256:f5845a9ea4efd834b747a109209d46b6dcb5e05e88a27df67de4aba03dd92f18",
      "sha256:000cddfa5fea51b517db796168add34b9648955dfa6421c8c158709d9687cb32",
      "sha256:4bd3750abf95ceb7d4e6c8f47acdc1c9db754325e050776186ae0a681e032fcd",
      "sha256:810c4b2cb213baf64895dec8566410e7b401436bf524c33d55893a45748c1bba",
      "sha256:5dcb620bac21a7449919d730e5e7ed23f9a0d791f72d3709b5cf3e81853adcd1",
      "sha256:09af1a244f314fe3558afa8d42e66ac376a18bf010544ba4872f3fe7461d1382",
      "sha256:c16ddbd687d181a095ca3ec8b108cf0d27a7a5408cc6e5073c03c903fbd344d3",
      "sha256:8b77549540c08a2571a7d7e8d11cc59519f36b613c0e1ef3c5d713d39f4e3507",
      "sha256:01079aef52a4ee46973ddd207c40f7b1ff4688216a5a05bfb37feea2041fc214",
      "sha256:2e43dfce6411894ef682d3ba313021264700033b0789f826b1304c8874695bc9",
      "sha256:616a5dfd09e5305cc271f77727a84d0c28628c758a994df65df75c33444ea42a",
      "sha256:8c9c8ab8442e9a7e3094090ac8d6659acb050d477d306841cea37eef4a379eed",
      "sha256:047be9dbcd6162c17cdfaee5380611072e27fb7b3de1c462d01d63f436b04f44",
      "sha256:8d25d3692cf4d95dca0327da7d8632c27cbdee71110a9c78628eba94fdc04e6d",
      "sha256:b21e2e4a55c8861e36503e6bb7385968e7db49247e07772927c3baf5c06336de",
      "sha256:ab0696412395709d6a71e21bba15cc474a52a34798149cee761d3accbb896296",
      "sha256:c81651668c205be10467a540129bd91eca20711f22b929a94839f780b1ff0d3f",
      "sha256:57cdc9e21eff8e78820f5222b3e21a06808564aa19884fa3003b12f58b325c7f",
      "sha256:18d72968405bb4ea92c826a718b080cc8b2f0d310f9c791af0bcf6cfd4e9dfc7",
      "sha256:1efa41d22392b374475e2472d0f6c710498052330f5c218296fbf327303d4890",
      "sha256:dd2dd93244de62000c96955f424a55699c6458d64932e4b170e0c42d095b3bc0",
      "sha256:432d521b81b9bcaef07786922cc16581cc6f008ea2bea79fd39d01a496814599"
    ]
  }
}
在这里,您将看到
“empty_layer”:true
,这表明Dockerfile的步骤只对
config.json
进行了更改,而没有创建新的文件系统层。因此,如果小心,可以计算历史记录和清单中的层,以确定哪个历史记录命令导致了哪个层/blob


另外,看看这些层中的命令历史记录,我认为一些较大的层是因为地形,二进制文件和插件不是很小(我在过去尝试制作一个快速provisioner容器时,发现我的图像通常比我想要的要大).

这是在docker hub上,图像是公开的吗?(拉层的API调用可能会有所不同。)@BMitch yes它位于Docker Hub上。(无论如何-)顺便说一句,有两年的时间