I'm trying to implement caching into my CI/CD process to make docker image building faster. I've the pervious built image and I want to use it during the building process. For every CI/CD job we have a clean building environment.
For testing I've made a pretty simple Dockerfile:
FROM node:16-alpine as base
ENV NODE_OPTIONS="--max-old-space-size=4096"
COPY package*.json ./
For building the CI/CD doing the steps below:
docker image pull node:16-alpine
docker image pull registry.gitlab.com/klmos/test:latest
docker image build -t cache_test:latest --cache-from=node:16-alpine,registry.gitlab.com/klmos/test:latest .
After running it I got this output:
16-alpine: Pulling from library/node
59bf1c3509f3: Already exists
683dd8c3cc08: Pull complete
ae5b2724f19b: Pull complete
39190df3f477: Pull complete
Digest: sha256:2c6c59cf4d34d4f937ddfcf33bab9d8bbad8658d1b9de7b97622566a52167f2b
Status: Downloaded newer image for node:16-alpine
docker.io/library/node:16-alpine
latest: Pulling from klmos/test
59bf1c3509f3: Already exists
683dd8c3cc08: Already exists
ae5b2724f19b: Already exists
39190df3f477: Already exists
a69f3fec5d45: Pull complete
Digest: sha256:bd53593d3c15720b49f6228a6e027b8b6b3396edac19683ec5ad5f4ef913b44e
Status: Downloaded newer image for registry.gitlab.com/klmos/test:latest
registry.gitlab.com/klmos/test:latest
[+] Building 0.6s (9/9) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 131B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/node:16-alpine 0.0s
=> importing cache manifest from registry.gitlab.com/klmos/test:latest 0.0s
=> importing cache manifest from node:16-alpine 0.0s
=> [1/2] FROM docker.io/library/node:16-alpine 0.2s
=> [internal] load build context 0.1s
=> => transferring context: 1.90MB 0.0s
=> [2/2] COPY package*.json ./ 0.3s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6052ed21a28aff3483d52a6b72ecc3237ce70cfb74f5bc8d467827a16fdf09cc 0.0s
=> => naming to docker.io/library/cache_test:latest
If I run it twice in the same job on the second run I can see the caching is working (because docker cache it locally imo):
16-alpine: Pulling from library/node
59bf1c3509f3: Already exists
683dd8c3cc08: Pull complete
ae5b2724f19b: Pull complete
39190df3f477: Pull complete
Digest: sha256:2c6c59cf4d34d4f937ddfcf33bab9d8bbad8658d1b9de7b97622566a52167f2b
Status: Downloaded newer image for node:16-alpine
docker.io/library/node:16-alpine
latest: Pulling from klmos/test
59bf1c3509f3: Already exists
683dd8c3cc08: Already exists
ae5b2724f19b: Already exists
39190df3f477: Already exists
a69f3fec5d45: Pull complete
Digest: sha256:bd53593d3c15720b49f6228a6e027b8b6b3396edac19683ec5ad5f4ef913b44e
Status: Downloaded newer image for registry.gitlab.com/klmos/test:latest
registry.gitlab.com/klmos/test:latest
[+] Building 0.6s (9/9) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 131B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/node:16-alpine 0.0s
=> importing cache manifest from registry.gitlab.com/klmos/test:latest 0.0s
=> importing cache manifest from node:16-alpine 0.0s
=> [1/2] FROM docker.io/library/node:16-alpine 0.2s
=> [internal] load build context 0.1s
=> => transferring context: 1.90MB 0.0s
=> [2/2] COPY package*.json ./ 0.3s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6052ed21a28aff3483d52a6b72ecc3237ce70cfb74f5bc8d467827a16fdf09cc 0.0s
=> => naming to docker.io/library/cache_test:latest
16-alpine: Pulling from library/node
Digest: sha256:2c6c59cf4d34d4f937ddfcf33bab9d8bbad8658d1b9de7b97622566a52167f2b
Status: Image is up to date for node:16-alpine
docker.io/library/node:16-alpine
latest: Pulling from klmos/test
Digest: sha256:bd53593d3c15720b49f6228a6e027b8b6b3396edac19683ec5ad5f4ef913b44e
Status: Image is up to date for registry.gitlab.com/klmos/test:latest
registry.gitlab.com/klmos/test:latest
[+] Building 0.1s (9/9) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 31B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/node:16-alpine 0.0s
=> importing cache manifest from node:16-alpine 0.0s
=> importing cache manifest from registry.gitlab.com/klmos/test:latest 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 72B 0.0s
=> [1/2] FROM docker.io/library/node:16-alpine 0.0s
=> CACHED [2/2] COPY package*.json ./ 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6052ed21a28aff3483d52a6b72ecc3237ce70cfb74f5bc8d467827a16fdf09cc 0.0s
=> => naming to docker.io/library/cache_test:latest
I've checked the two images(pulled from the registry, built locally) in docker inspect and it seems like the layer digests are the same.
Image built locally:
[
{
"Id": "sha256:4b6b0dcada8537ff91f11847167d234653f3c3ff1dca9ff509ce2b1961f2a602",
"RepoTags": [
"cache_test:latest"
],
"RepoDigests": [],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2022-03-06T09:13:05.6932944Z",
"Container": "",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NODE_VERSION=16.14.0",
"YARN_VERSION=1.22.17",
"NODE_OPTIONS=--max-old-space-size=4096"
],
"Cmd": [
"node"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 112402099,
"VirtualSize": 112402099,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/f310653033bb280f11066e8b4a9103347427a0bf6a1ad9e7ab19df4e006b4852/diff:/var/lib/docker/overlay2/9833eb7cfcfb226745a590a8af58952faccabc24cf57a0cb8d66f59e4595e47e/diff:/var/lib/docker/overlay2/3a7a06b5799f10aee38528a75f053d2bff147244c3418fab79c3ecedcc948c32/diff:/var/lib/docker/overlay2/f78b9ba5d8999843ff91062118b9b13c8a9fb48e9d787bd1aa542d7cc372d5c2/diff",
"MergedDir": "/var/lib/docker/overlay2/493b66cd85249e9bce803d2ec23dc2a019ad3f1c2d9d1f612b4fb1ba1903576d/merged",
"UpperDir": "/var/lib/docker/overlay2/493b66cd85249e9bce803d2ec23dc2a019ad3f1c2d9d1f612b4fb1ba1903576d/diff",
"WorkDir": "/var/lib/docker/overlay2/493b66cd85249e9bce803d2ec23dc2a019ad3f1c2d9d1f612b4fb1ba1903576d/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:8d3ac3489996423f53d6087c81180006263b79f206d3fdec9e66f0e27ceb8759",
"sha256:5be440dc5019b5a760b0ebc5c6764cc3759726559486834be386b48dcb09ccdb",
"sha256:c833154f20e95c1de46899bc89eabd5608ddd1801a173c64efdd19d16603fbc5",
"sha256:49281578ca1a4cf99861260efa0c9280733e24182e268621525623e69b76f803",
"sha256:cc3cf0a5db8874be17d0980cb2d0fd1727d8d8d1e3ad9301f3a7e270ad887cb9"
]
},
"Metadata": {
"LastTagTime": "2022-03-06T09:13:16.2790601Z"
}
}
]
Image pulled from the registry:
[
{
"Id": "sha256:0b69a3739db66e32022e1f58ce1e9f29466b39813569e071f17c08ab1273a090",
"RepoTags": [
"registry.gitlab.com/klmos/test:latest"
],
"RepoDigests": [
"registry.gitlab.com/klmos/test@sha256:bd53593d3c15720b49f6228a6e027b8b6b3396edac19683ec5ad5f4ef913b44e"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2022-03-06T08:45:10.5063306Z",
"Container": "",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NODE_VERSION=16.14.0",
"YARN_VERSION=1.22.17",
"NODE_OPTIONS=--max-old-space-size=4096"
],
"Cmd": [
"node"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 112402099,
"VirtualSize": 112402099,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/f310653033bb280f11066e8b4a9103347427a0bf6a1ad9e7ab19df4e006b4852/diff:/var/lib/docker/overlay2/9833eb7cfcfb226745a590a8af58952faccabc24cf57a0cb8d66f59e4595e47e/diff:/var/lib/docker/overlay2/3a7a06b5799f10aee38528a75f053d2bff147244c3418fab79c3ecedcc948c32/diff:/var/lib/docker/overlay2/f78b9ba5d8999843ff91062118b9b13c8a9fb48e9d787bd1aa542d7cc372d5c2/diff",
"MergedDir": "/var/lib/docker/overlay2/493b66cd85249e9bce803d2ec23dc2a019ad3f1c2d9d1f612b4fb1ba1903576d/merged",
"UpperDir": "/var/lib/docker/overlay2/493b66cd85249e9bce803d2ec23dc2a019ad3f1c2d9d1f612b4fb1ba1903576d/diff",
"WorkDir": "/var/lib/docker/overlay2/493b66cd85249e9bce803d2ec23dc2a019ad3f1c2d9d1f612b4fb1ba1903576d/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:8d3ac3489996423f53d6087c81180006263b79f206d3fdec9e66f0e27ceb8759",
"sha256:5be440dc5019b5a760b0ebc5c6764cc3759726559486834be386b48dcb09ccdb",
"sha256:c833154f20e95c1de46899bc89eabd5608ddd1801a173c64efdd19d16603fbc5",
"sha256:49281578ca1a4cf99861260efa0c9280733e24182e268621525623e69b76f803",
"sha256:cc3cf0a5db8874be17d0980cb2d0fd1727d8d8d1e3ad9301f3a7e270ad887cb9"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
Why docker's --cache-from not working for me? How can I make it working as expected?