1

I'd like to use docker as tool to compile (ningx) modules for multiple architectures (x86-64 and ARM).

I got my Dockerfile working and it's building each multi-arch image ok but I can't figure out hot to extract (copy) the compiled libraries out of each docker image without actually running the containers and since I can't run the arm image on my local laptop I'm stuck.

Does anyone have a simple/clever way of doing it?

Thanks in advance

epc
  • 194
  • 4
  • 12
  • Can you `docker create` a wrong-architecture container, even if it's not going to be runnable? If you can then you can `docker cp` out of it. – David Maze Jun 14 '22 at 20:42

1 Answers1

3

You can export content from an image directly in the build command, telling docker to output to a filesystem instead of outputting to an image:

FROM base as build
RUN build commands here

FROM scratch as artifact
COPY --from=build /usr/local/bin/app /app

FROM runtime as release
COPY --from=build /usr/local/bin/app /usr/local/bin/app
ENTRYPOINT ["/usr/local/bin/app"]

Then build with:

docker build --target=artifact --output type=local,dest=out/ .

Which would create an out/app.

The other options include pulling files directly out of the image tar blobs, or doing a docker create and docker cp to copy files out of your image. To pull files directly out of the blob, you would need to know which layer contains the files, and then pull that blob, extracting through tar:

$ regctl manifest get localhost:5000/library/alpine \
    --platform linux/amd64 --format '{{jsonPretty .}}'
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 1472,
    "digest": "sha256:e66264b98777e12192600bf9b4d663655c98a090072e1bab49e233d7531d1294"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 2798889,
      "digest": "sha256:2408cc74d12b6cd092bb8b516ba7d5e290f485d3eb9672efc00f0583730179e8"
    }
  ]
}

$ regctl blob get localhost:5000/library/alpine sha256:2408cc74d12b6cd092bb8b516ba7d5e290f485d3eb9672efc00f0583730179e8 | tar -tvzf - | head -20
drwxr-xr-x 0/0               0 2022-05-23 12:51 bin/
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/arch -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/ash -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/base64 -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/bbconfig -> /bin/busybox
-rwxr-xr-x 0/0          837272 2022-05-09 13:27 bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/cat -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/chattr -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/chgrp -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/chmod -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/chown -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/cp -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/date -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/dd -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/df -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/dmesg -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/dnsdomainname -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/dumpkmap -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/echo -> /bin/busybox
lrwxrwxrwx 0/0               0 2022-05-23 12:51 bin/ed -> /bin/busybox
BMitch
  • 231,797
  • 42
  • 475
  • 450