我最近切换到多阶段 docker 构建,中间构建似乎没有任何缓存。我不确定这是否是 docker 限制,一些不可用的东西,或者我做错了什么。
我正在拉下最终构建并在新构建开始时执行 --cache-from ,但它始终运行完整构建。
我最近切换到多阶段 docker 构建,中间构建似乎没有任何缓存。我不确定这是否是 docker 限制,一些不可用的东西,或者我做错了什么。
我正在拉下最终构建并在新构建开始时执行 --cache-from ,但它始终运行完整构建。
这似乎是 docker 本身的限制,并在此问题下进行了描述 - https://github.com/moby/moby/issues/34715
解决方法是:
由于发布了先前的答案,现在有一个使用 BuildKit 后端的解决方案:https ://docs.docker.com/engine/reference/commandline/build/#specifying-external-cache-sources
这涉及将参数传递--build-arg BUILDKIT_INLINE_CACHE=1给您的docker build命令。您还需要通过设置环境变量来确保正在使用 BuildKit DOCKER_BUILDKIT=1(在 Linux 上;我认为在使用最新版本的 Docker Desktop 时,BuildKit 可能是 Windows 上的默认后端)。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(感谢 BuildKit DOCKER_BUILDKIT=1),然后您可以BUILDKIT_INLINE_CACHE: 1在YAML 文件args:部分的build:部分中进行设置以确保所需--build-arg的是放。