Docker 图片推送到 ECR 时与本地图片大小不同

Docker image different size when pushed to ECR than locally

我的本地机器上有一个 1.46GB 的 docker 图像,但是当它被推送到 AWS ECR 时(通过我的本地机器或通过 CicleCI 部署)它只有 537.05MB。我是 Docker 和 AWS 的新手,所以如果能帮助我弄清楚为什么会这样,我将不胜感激!

我感觉无论出于何种原因它都没有完全上传到 ECR,因为我正在尝试将此容器用于批处理作业,但由于某种原因,在本地使用时可以使用的相同命令在本地使用时不起作用在作业定义中使用。该命令只是 python app.py,但我也尝试过使用绝对路径 python /usr/local/src/app/app.py,这两个结果都是 [Errno 2] No such file or directory.

我的Makefile部署中使用的命令如下:

docker build --force-rm=true -t $(EXTRACTOR_IMAGE_NAME) ./extractor
docker tag $(EXTRACTOR_IMAGE_NAME) $(EXTRACTOR_ECR_IMAGE_NAME)
$(shell aws ecr get-login --no-include-email)
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/$(EXTRACTOR_ECR_REPO)

编辑 1: 我认为这可能与基本图像的大小有关,在本例中为 python:2.7。基本映像为 914MB,加上我的 ECR 映像的大小 537.05MB = 1451.05MB,即大约 1.46GB。仍然不确定 Batch 命令的问题是什么...

编辑 2: 我一直在使用卷将代码安装到我的容器中,这就是它在本地工作的原因。在构建时,我忘记将代码复制到容器中,我认为这是 Batch 不起作用的唯一原因!

这可能是由于 docker 客户端在将图像推送到 ECR 之前的行为 documented:

Beginning with Docker version 1.9, the Docker client compresses image layers before pushing them to a V2 Docker registry. The output of the docker images command shows the uncompressed image size, so it may return a larger image size than the image sizes shown in the AWS Management Console.

因此,当您拉取镜像时,您会注意到镜像层经历了三个阶段:

  • 正在下载
  • 提取
  • 完成

关于这个命令:python /usr/local/src/app/app.py 正在执行它,而你在 /usr/local/src/app/ 里面?您可能需要首先确保这一点,并且在推送之前使用图像检查容器内的命令,因为错误似乎与代码相关,而不是 docker 问题

我们可以在the AWS ECR documentation中阅读以下内容:

Note

Beginning with Docker version 1.9, the Docker client compresses image layers before pushing them to a V2 Docker registry. The output of the docker images command shows the uncompressed image size, so it may return a larger image size than the image sizes shown in the AWS Management Console.

我怀疑你会得到你期望的大小,你会使用 CLI (docker images) 而不是 ECR Web 控制台吗?