- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
[情况] 所以我们有这个 docker 镜像。像所有其他图像一样,它由几层组成。一旦我们在 docker pull image:v42
期间发现了这一点,两个特定的图层需要很长时间才能下载,有时甚至会挂断几分钟。
不知何故,我想调试并找出 Dockerfile 的哪一部分在这两层中。执行后docker history image-id
甚至使用 Dive ,我发现层摘要与 docker pull
期间终端中显示的摘要完全不同.甚至层的大小也不同。
[问题] 有没有办法将这些“docker 历史”摘要与“docker pull”摘要相关联?或者即我怎样才能找出这些层中下载的内容?
[p.s.]我想到的唯一可能有帮助的事情是注释掉整个 Dockerfile,开始逐行取消注释并在每个新行中构建一个镜像。最后,我会偶然发现这些层。但必须有更好的方法。不?
更新(2020 年 9 月 12 日 | Docker 19.03.12):我们发现在无根模式下运行 Docker 会使拉取时间加倍。即 5GB 镜像 docker pull 作为 root --> ~4min。和 docker pull 以无根模式-> ~9-10min。大部分时间用于下载这 2 层并提取所有层。
最佳答案
除了它们的大小之外,很难指定为什么这些层很慢。如果上游还有其他原因,那就是从 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 注册表 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
产生了更改。并且没有创建新的文件系统层。因此,如果您小心,您可以计算历史记录和 list 中的层数,以确定哪个历史命令导致了哪个层/blob。
关于docker - 如何逐层调试docker pull?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63753394/
昨晚我因为这个问题脑子崩溃了。在确保没有来 self 的 eclipse 错误检查的明显错误之后,我开始调试我的程序。顺便说一下,我正在使用 Jre7。无论如何,每次我进入我的类调用(我们称之为“a”
(前言:我对 C/C++ 还很陌生,我真的不知道 native 代码中的调试实际上是如何工作的。) 一些消息来源说 gdb 和 lldb 可以调试 any program compiled to ma
我正在尝试从 Visual Studio 2012 外部调试 T4Scaffolding.Core Nuget 包。我使用的是安装了 Powershell 3.0 的 Powershell ISE,并
如何调试汇编代码?我在 Linux 上使用 gdb。我知道我可以看寄存器。有哪些调试汇编代码的方法? 最佳答案 您当然可以使用 breakpoints就像 C 或任何其他编译语言一样。 This ar
如何在每次通话时打印列表或 haskell 中的内容,例如: funct a list = funct (a + 1) (a : list) print list her
让我用我对 Makefiles 或 make 知之甚少的评论作为这个问题的前缀。 有一个非常大的项目,每晚自动构建。它以 Debug 和 Release 模式构建,Debug 用于 Valgrind
我正在创建一个计算每周工资的程序,那么任何加类工资都是该周正常工资的 1.5 倍。我的代码如下: #include int main() { double payrate; double h
我使用的是 Visual Studio 2010 Express Developer 版本。开发网站。我在我的 .aspx 页面中使用 JavaScript。 如何在 Javascript 中放置断点
我最近开始修补 Project Euler 问题,并尝试用 Javascript 解决它们。这样做我往往会产生许多无限循环,现在我想知道是否有比终止 Firefox 或 Chrome 中的选项卡更好的
有没有办法在程序执行期间生成一个交互式 python 控制台(最好是 iPython)而不暂停主程序并且能够检查和修改程序变量?类似于浏览器为 JavaScript 提供的功能。 我知道 pdb.se
我正在使用 FFmpeg @ Android 并希望能够进入 FFmpeg 代码(Eclipse + Seqouya),同时编译 FFmpeg 我使用 --disable-stripping --en
我从使用互操作调用 win32 api 函数的 .net 进程中得到一个异常。 我有一个调试器,我想查看 LastError 的值。 是否可以从 Visual Studio 调试器中查看 LastEr
我正在尝试通过 VBA 创建一个宏,以在 IE 的多个选项卡中打开一组指定的链接。目前我正在使用下面的代码,如果我试图打开 3 个或更少的选项卡,它大部分时间都可以工作。任何超过 3 的代码都会在“N
好的,这似乎是一个愚蠢的问题,因为 MonoDevelop 越来越成熟,所以我确定我只是想念它,但我环顾四周,所有关于这个主题的问题似乎都是关于远程调试或 Mac 上的调试。 我使用的是 Ubuntu
如何调试 Rscripts是从命令行运行的? 我目前正在使用 getopt传递命令行选项的包,当有错误时,我很难: 看看到底出了什么问题; 在 R 中交互式调试(因为脚本需要命令行选项。) 有没有人有
支持 PDF 和网络上的信息很少。我碰巧在博客中看到一篇文章,提到 $.write() 或 $.writeln() 将向 javascript 控制台写入一个字符串。相当有用。有谁知道这个 $ 对象是
PyCharm 1.5 中是否可以使用 Firefox 和 Chrome 支持的 JavaScript 调试? 如果是这样,它能否与 Python/Django 调试器一起有效运行? 如果没有,有没有
我确定这以前发生在人们身上,某些东西在 Debug模式下工作,你在发布时编译,但有些东西坏了。 这发生在我在嵌入式 XP 环境中工作时,我发现最好的方法确实是编写一个日志文件来确定它会出错的地方。 您
我目前正在为即将到来的项目评估 Flow3。 AOP 模式和依赖注入(inject)将非常适合我们的目的。 现在我想不通的是如何在 Controller Action 中调试一些结果。 public
最初,我有一个包含测试服务器的 Django 应用程序。要调试此设置,我只需添加 import pdb; pdb.set_trace()代码中的任何位置,并且有一个断点将我扔到终端中的交互式调试器中(
我是一名优秀的程序员,十分优秀!