我最近切换到了多阶段docker构建,中间的构建似乎没有任何缓存。我不确定这是否是docker限制,某些不可用或我做错了什么。
我要撤消最终版本,并在新版本开始时执行--cache-,但是它始终会运行完整版本。
答案 0 :(得分:9)
这似乎是docker本身的局限性,在此问题下进行了描述-https://github.com/moby/moby/issues/34715
解决方法是:
答案 1 :(得分:0)
自从上一个答案发布后,现在有一个使用 BuildKit 后端的解决方案:https://docs.docker.com/engine/reference/commandline/build/#specifying-external-cache-sources
这涉及将参数 --build-arg BUILDKIT_INLINE_CACHE=1
传递给您的 docker build
命令。您还需要通过设置环境变量 DOCKER_BUILDKIT=1
来确保正在使用 BuildKit(在 Linux 上;我认为 BuildKit 可能是 Windows 上使用最新版本的 Docker Desktop 时的默认后端)。 CI 的完整命令行解决方案可能如下所示:
export DOCKER_BUILDKIT=1
# Use cache from remote repository, tag as latest, keep cache metadata
docker build -t yourname/yourapp:latest --cache-from yourname/yourapp:latest --build-arg BUILDKIT_INLINE_CACHE=1 .
# Push new build up to remote repository replacing latest
docker push yourname/yourapp:latest
其他一些评论者正在询问 docker-compose
。它也适用于此,尽管您需要另外指定环境变量 COMPOSE_DOCKER_CLI_BUILD=1
以确保 docker-compose 使用 docker CLI(由于 DOCKER_BUILDKIT=1
使用 BuildKit),然后您可以设置 BUILDKIT_INLINE_CACHE: 1
在 YAML 文件的 args:
部分的 build:
部分中,以确保设置了所需的 --build-arg
。