Docker镜像大小

6

我从Docker Hub上拉取了一个约0.5GB大小的Docker镜像。在我的Centos机器上拉取后,镜像的大小变成了1.6GB。使用新名称推送该镜像时,在Docker Hub上显示为2GB。 如何获得与Docker Hub上相同大小的镜像?


1
你能提供更多细节吗?一个复现者? - user2915097
Docker Hub 上列出的标签大小是压缩后的大小。镜像在发送给您时已经被压缩,一旦被拉取到本地服务器上就会被解压缩,因此实际大小比列表中的要大得多。 - Andy Shinn
你可以使用 https://github.com/wemake-services/docker-image-size-limit 来检查你的镜像大小是否过大。 - sobolevn
2个回答

2
有几种方法可以实现这一点,具体取决于您查询的存储库。
简而言之,查看此存储库:schnatterer/docker-image-size
详情:
前两种方法适用于DockerHub,并针对测试镜像debian:stretch-20190204-slim返回相同的大小 on DockerHub

Screenshot DockerHub

我还没有找到针对quay.io和私有仓库的有效解决方案。
docker manifest
需要jq
export DOCKER_CLI_EXPERIMENTAL=enabled

echo $(( ( $(docker manifest inspect -v docker.io/debian:stretch-20190204-slim \
              | jq '.[] | select(.Descriptor.platform.architecture == "amd64").SchemaV2Manifest.layers[0].size') \
           + 500000) \
         / 1000 \
         / 1000)) MB
23 MB

如果您关心细节:
  • export DOCKER_CLI_EXPERIMENTAL=enabled - docker manifest 仍被视为实验性的(截至18.06.1-ce)。可以在 ~/.docker/config.json 中永久设置 - 请参见 docker manifest | Docker 文档
  • docker manifest inspect -v docker.io/debian:stretch-20190204-slim - 查询来自 Docker Hub 的详细清单
  • jq '.[] | select(.Descriptor.platform.architecture == "amd64").SchemaV2Manifest.layers[0].size - 过滤所有层的压缩大小(字节)
  • + 500000 - 四舍五入
  • /1000 - 除以 KB/MB

reg

需要 regjq

echo $(( ( $(reg manifest debian:stretch-20190204-slim |  \
            jq '.layers[].size' \
            | paste -sd+ | bc) \
           + 500000) \
         / 1000 \
         / 1000)) MB
23 MB

如果您关心细节:
  • reg manifest debian:stretch-20190204-slim - 从Docker Hub查询清单
  • jq '.layers[].size' - 过滤每个层的压缩大小(字节)
  • paste -sd+ | bc - 创建各个大小的总和(字节)
  • + 500000 - 用于四舍五入
  • /1000 - 分成KB/MB

curl

regdocker manifest在某些其他存储库中无法直接使用。然而,这里可能只需要使用curl。但是,对于Docker Hub来说,这会更加困难(因为我们需要一个令牌)。

echo $(( ( $(curl -s https://gcr.io/v2/distroless/java/manifests/11-debug |  \
            jq '.layers[].size' \
            | paste -sd+ | bc) \
           + 500000) \
         / 1000 \
         / 1000)) MB
69 MB

更多的注册表例子:

1

在Ubuntu上的docker 1.7.0中,有一个类似的问题(问题14204)报告过。
(而且默认情况下,CentOS可能没有最新版本的docker,所以第一步是升级如果可能的话

需要检查的问题:

  1. 您是如何安装docker的?
  2. 您能提供重现该问题的步骤清单吗?
  3. 您能发布sudo du -sh /var/lib/docker/*的输出吗?
  4. 您正在使用devicemapper作为存储驱动程序,您可以尝试使用aufs吗?

对于最后一点,请参阅本文描述,检查/etc/default/docker

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--storage-driver=devicemapper"

根据OP Dragomir Adrian评论中的确认,问题出在Docker版本上:升级到1.9.1即可解决。


yum安装docker - Dragomir Adrian
@DragomirAdrian,使用yum安装的docker版本是多少? - VonC
  1. yum install docker Docker版本1.8.2,构建版本为bb472f0/1.8.2 内核版本为3.10.0-229.20.1.el7.x86_64
    • docker login
  • docker pull [image] 在Docker公共Hub上,镜像大小为494 MB
  • docker images 镜像大小为1582 MB
  • 创建一个私有的Docker仓库
  • docker tag [image] username/[repository name]
  • docker push username/[repository name] 现在,在Docker私有仓库中,我有一个大小为2 GB的测试镜像
  1. 存储驱动已经是devicemapper
- Dragomir Adrian
1
@DragomirAdrian 好的。首先,将所有内容升级到最新版本。Docker 1.9.1。 - VonC
最终我升级到了1.9.1版本并重复了该过程。现在Docker镜像的大小是正确的,谢谢。我仍然有一个问题:为什么显示我通过互联网推送了1.6 GB,而Docker镜像只有494 MB? - Dragomir Adrian
@DragomirAdrian 不确定推送部分。为了更好的可见性,我在答案中包含了升级部分。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接