Dockerfile中的ADD命令总是导致缓存失效

75次阅读
没有评论

问题描述

在使用Dockerfile构建镜像时,用户遇到了一个问题。在构建完镜像后,它会作为一个”cache-image”推送到仓库中,这样在下一次构建时,可以通过”–cache-from”选项拉取并使用该缓存镜像。然而,问题在于,在第一个ADD命令后,构建就停止使用缓存。
以下是一个构建日志的示例,可以看到在第一个ADD命令之后,缓存就不再被使用了:

Step 20/30 : WORKDIR $PROJECT_PATH
---> Using cache
---> d79e2ba28d96
Step 21/30 : ADD requirements $PROJECT_PATH/requirements
---> 6261bb0bd3e6
Removing intermediate container 26707f4107c9

用户已经运行了两个镜像(缓存镜像和构建后的镜像),并且检查了requirements目录的内容,它们完全相同。整个构建过程是在Bamboo的工作节点上完成的。

解决方案

请注意以下操作可能涉及版本差异,建议进行备份操作。

使用docker image history检查镜像历史

首先,我们可以通过使用docker image history命令来检查两个镜像的历史记录。特别关注ADD行中文件的sha256校验和。Docker对文件执行校验和,包括这些文件的一些元数据,因此即使是单个字节的更改或权限更新也会导致缓存失效。

docker image history cache-image
docker image history built-image

通过对比两个镜像的历史记录,你可以检查是否存在导致缓存失效的变化。

考虑使用COPY命令

另外,除非你需要拉取远程文件或将tar文件解压到目录中,建议使用COPY命令代替ADD命令。这样做可以避免不必要的缓存失效情况。COPY命令仅将本地文件复制到镜像中,不执行额外的解压或下载操作。

COPY requirements $PROJECT_PATH/requirements

调整文件权限

有时候,文件的权限问题也可能导致缓存失效。确保在添加文件到镜像中时,文件的权限与预期一致。

注意版本差异

请注意,Docker的不同版本可能在缓存管理方面有所不同。如果你在不同版本的Docker上遇到了相同的问题,可以尝试升级或降级Docker来查看是否有改善。

总结

在构建Docker镜像时,缓存的有效利用对于提高构建速度和减少资源消耗非常重要。通过检查文件的sha256校验和、考虑使用COPY命令以及调整文件权限,可以避免不必要的缓存失效问题。同时,注意不同Docker版本可能会影响缓存行为,可以考虑升级或降级Docker来解决问题。

正文完