How to use docker build caching properly with remote registry image?

Viewed 228

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?

0 Answers
Related