Skip to content

Multi-stage buildx build corrupts character special files #1027

@JRaspass

Description

@JRaspass

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions