docker build --no-cache 会构建不同的层吗?

Posted

技术标签:

【中文标题】docker build --no-cache 会构建不同的层吗?【英文标题】:does docker build --no-cache builds different layers? 【发布时间】:2020-11-17 16:44:22 【问题描述】:

几个月前,我决定使用 no-cache 标志设置构建 docker 映像的项目的 CI:我认为最好不要冒险让 docker 使用旧的缓存层。

我现在才意识到,我的图像层的 sha 总是不同的(即使新构建的图像应该生成与之前构建的相同的层)并且每当我拉新构建的图像时,所有层总是从零。

我现在认为问题在于 --no-cache 标志,我知道这听起来很明显,但老实说,我认为 --no-cache 只是执行速度较慢,但​​也认为它是以功能方式实现的(相同的命令 + 相同的内容 = 相同的层)。

有人可以确认--no-cache 标志是问题所在吗?

【问题讨论】:

【参考方案1】:

容器的问题是,实际上,你永远不会用相同的 sha 构建相同的层。如果您使用之前构建的同一层,您只能拥有相同的 sha。

这样想:每次构建一个层时,都会至少有一个日志文件、一个时间戳,一些不同的东西——然后我们还没有提到引入的外部依赖项。

--no-cache 标志将简单地阻止 Docker 引擎使用缓存层,它会再次下载和构建所有内容。因此,该标志确实是您的哈希值不同的(间接)原因,但这是预期的行为。从缓存构建意味着您的构建会更快,但会重用以前构建的层,因此具有相同的 sha(这可能会导致重用以前的陈旧结果等等,这就是我们有标志的原因)。

查看这篇文章了解更多信息: https://thenewstack.io/understanding-the-docker-cache-for-faster-builds/

如果您希望保证某些层具有相同的 sha 但仍不想使用缓存,您可能需要查看多阶段 Docker 构建: https://docs.docker.com/develop/develop-images/multistage-build/

通过这种方式,您可以拥有一个固定的基础镜像,并在此基础上构建其他所有内容。

【讨论】:

以上是关于docker build --no-cache 会构建不同的层吗?的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 常用命令参数解释

借助层级缓存优化Dockerfile

15个Docker命令

Windows docker构建警告非windows docker主机

gradle docker plugin bmuschko 将 build.gradle 拆分为两个文件会出错

Docker多阶段构建实战(multi-stage builds)