除了图层的大小,很难具体说明为什么它们会很慢。如果有其他上游原因,那么从Cloudflare到Docker的托管(可能在类似AWS S3存储桶的东西中)再到您的本地网络,这是许多不同组件的移动。还有针对非常重度使用的速率限制(这些限制将在另外几个月内对其他用户更加明显)。假设这只是一个大图层,您可以直接从注册表中拉取blob以进行检查。以下是使用curl命令打Registry API的一些示例脚本:
$ cat manifest-v2.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
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
关于为什么摘要不同,这要归结于压缩。这些块的媒体类型是注册表上的压缩tar文件,但一旦下载到本地docker引擎,它会将层解压缩,并且本地摘要在未压缩的tar文件上。这也解释了为什么大小不匹配。
要使层与历史记录对齐,可以将历史记录与清单进行比较,只需注意行的顺序(
docker history
以及v1注册表API显示的行是相反的,而v2 API调用将从最旧的到最新的显示),并且并不是历史记录中的每一行都会导致新的块。如果查看与图像相关联的配置JSON,则这变得更加明显:
$ more get-config-v2.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。
P.S. 查看这些层中的命令历史记录,我预计有些大的层是因为 terraform 导致的,因为二进制文件和插件不是很小(过去我曾尝试快速创建 provisioner 容器,但发现我的镜像往往比我想要创建的容器大)。