buildx icon indicating copy to clipboard operation
buildx copied to clipboard

Multi-stage buildx build corrupts character special files

Open JRaspass opened this issue 2 years ago • 1 comments

Single-stage (works)

FROM alpine:3.15

RUN mknod -m 444 /my-urandom c 1 9

CMD ls -l /dev/urandom /my-urandom

docker build

$ docker build -t docker-bug . && docker run --rm docker-bug
...
crw-rw-rw-    1 root     root        1,   9 Mar 26 10:31 /dev/urandom
cr--r--r--    1 root     root        1,   9 Mar 26 10:24 /my-urandom

docker buildx

$ docker buildx build -t docker-bug . && docker run --rm docker-bug
...
crw-rw-rw-    1 root     root        1,   9 Mar 26 10:33 /dev/urandom
cr--r--r--    1 root     root        1,   9 Mar 26 10:24 /my-urandom

Multi-stage (builx doesn't work)

FROM alpine:3.15

RUN mknod -m 444 /my-urandom c 1 9

FROM scratch

COPY --from=0 / /

CMD ls -l /dev/urandom /my-urandom

docker build

$ docker build -t docker-bug . && docker run --rm docker-bug
...
crw-rw-rw-    1 root     root        1,   9 Mar 26 10:34 /dev/urandom
cr--r--r--    1 root     root        1,   9 Mar 26 10:24 /my-urandom

docker buildx (note the lack of c in /my-urandom)

$ docker buildx build -t docker-bug . && docker run --rm docker-bug
...
crw-rw-rw-    1 root     root        1,   9 Mar 26 10:35 /dev/urandom
-r--r--r--    1 root     root             0 Mar 26 10:24 /my-urandom

I noticed this when switching an application to buildx that specifically doesn't mount the hosts /dev and just populates what it needs (like /dev/urandom) and those reads were blocking indefinitely since buildx had made a zero byte regular file instead.

Now it may be that this isn't a bug and that character special files aren't supported but I would argue it's at least a little surprising when both legacy docker build and docker buildx with single-stage build both worked.

$ docker version
Client:
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.18
 Git commit:        a224086349
 Built:             Thu Mar 24 08:56:17 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.14
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18
  Git commit:       87a90dc786
  Built:            Thu Mar 24 08:56:03 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.6.2
  GitCommit:        de8046a5501db9e0e478e1c10cbcfb21af4c6b2d.m
 runc:
  Version:          1.1.0
  GitCommit:        v1.1.0-0-g067aaf85
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
$ docker buildx version
github.com/docker/buildx v0.8.1-docker 5fac64c2c49dae1320f2b51f1a899ca451935554

JRaspass avatar Mar 26 '22 10:03 JRaspass

I am running buildx v0.12.0 and buildkit v0.12.5 and the problem seems to be solved now!

sprat avatar May 14 '24 15:05 sprat