Suppose I am building an image using Docker Buildkit. My image is from a multistage Dockerfile, like so:
FROM node:12 AS some-expensive-base-image ... FROM some-expensive-base-image AS my-app ...
I am now trying to build both images. Suppose that I push these to Docker Hub. If I were to use Docker Buildkit’s external caching feature, then I would want to try to save build time on my CI pipeline by pulling in the remote
some-expensive-base-image:latest image as the cache when building the
some-expensive-base-image target. And, I would want to pull in both the just-built
some-expensive-base-image image and the remote
my-app:latest image as the caches for the latter image. I believe that I need both in order to prevent requiring the steps of
some-expensive-base-image from needing to be rebuilt, since…well…they are expensive.
This is what my build script looks like:
export DOCKER_BUILDKIT=1 docker build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from some-expensive-base-image:latest --target some-expensive-base-image -t some-expensive-base-image:edge . docker build --build-arg BUILDKIT_INLINE_CACHE=1 --cache-from some-expensive-base-image:edge --cache-from my-app:latest --target my-app -t my-app:edge .
My question: Does the order of the
--cache-from arguments matter for the second
I have been getting inconsistent results on my CI pipeline for this build. There are cache misses that are happening when building that latter image, even though there hasn’t been any code changes that would have caused cache busting. The Cache Minefest can be pulled without issue. There are times when the cache image is pulled, but other times when all steps of that latter target need to be rerun. I don’t know why.
By chance, should I instead try to
docker pull both images before running the
docker build commands in my script?
Also, I know that I referred to Docker Hub in my example, but in real life, my application uses AWS ECR for its remote Docker repository. Would that matter for proper Buildkit functionality?