This may be (somewhat) expected, but thought I'd open a ticket, because I can see use-cases where this functionality would be useful.
Description
I'm trying to exclude paths in the build-context (through .dockerignore), to prevent those paths from being included in the image that is built. However, some steps make use of the excluded files, and to provide access, I'm using RUN --mount, to "overlay" the excluded files.
Prepare
mkdir excluded_mount && cd mkdir excluded_mount
mkdir -p assets src
touch assets/some-file.txt src/some-source-file.txt
cat > Dockerfile <<EOF
#syntax=docker/dockerfile:1.2
FROM busybox
WORKDIR /project
COPY . .
# Mount the assets directory, and recursively show all files in the project
# directory. Exit with a non-zero exit code, so that the results are printed.
RUN --mount=source=/assets,target=/project/assets ls -lR && exit 1
EOF
Without dockerignore
Build the Dockerfile, and notice that the assets directory is successfully mounted
$ DOCKER_BUILDKIT=1 docker build --no-cache .
[+] Building 2.7s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.2s
=> => transferring dockerfile: 181B 0.0s
=> [internal] load .dockerignore 0.2s
=> => transferring context: 2B 0.0s
=> resolve image config for docker.io/docker/dockerfile:1.2 1.1s
=> CACHED docker-image://docker.io/docker/dockerfile:1.2@sha256:e2a8561e419ab1ba6b2f... 0.0s
=> [internal] load metadata for docker.io/library/busybox:latest 0.0s
=> [1/4] FROM docker.io/library/busybox 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 303B 0.0s
=> CACHED [2/4] WORKDIR /project 0.0s
=> [3/4] COPY . . 0.2s
=> ERROR [4/4] RUN --mount=source=/assets,target=/project/assets ls -lR && exit 1 0.5s
------
> [4/4] RUN --mount=source=/assets,target=/project/assets ls -lR && exit 1:
#10 0.353 .:
#10 0.353 total 12
#10 0.353 -rw-r--r-- 1 root root 137 Jan 13 12:21 Dockerfile
#10 0.353 drwxr-xr-x 2 root root 4096 Jan 13 12:20 assets
#10 0.353 drwxr-xr-x 2 root root 4096 Jan 13 12:20 src
#10 0.353
#10 0.353 ./assets:
#10 0.353 total 0
#10 0.353 -rw-r--r-- 1 root root 0 Jan 13 12:19 some-file.txt
#10 0.353
#10 0.353 ./src:
#10 0.353 total 0
#10 0.353 -rw-r--r-- 1 root root 0 Jan 13 12:19 some-source-file.txt
------
executor failed running [/bin/sh -c ls -lR && exit 1]: exit code: 1
With a .dockerignore
Create a .dockerignore to exclude the assets directory from COPY:
echo "/assets/" > Dockerfile.dockerignore
Build the image again;
$ DOCKER_BUILDKIT=1 docker build --no-cache .
[+] Building 2.3s (10/10) FINISHED
=> [internal] load build definition from Dockerfile 0.2s
=> => transferring dockerfile: 103B 0.0s
=> [internal] load .dockerignore 0.2s
=> => transferring context: 2B 0.0s
=> resolve image config for docker.io/docker/dockerfile:1.2 1.2s
=> CACHED docker-image://docker.io/docker/dockerfile:1.2@sha256:e2a8561e419ab1ba6b2f... 0.0s
=> [internal] load metadata for docker.io/library/busybox:latest 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 157B 0.0s
=> [1/4] FROM docker.io/library/busybox 0.0s
=> CACHED [2/4] WORKDIR /project 0.0s
=> CANCELED [3/4] COPY . . 0.3s
=> ERROR [4/4] RUN --mount=source=/assets,target=/project/assets ls -lR && exit 1 0.0s
------
> [4/4] RUN --mount=source=/assets,target=/project/assets ls -lR && exit 1:
------
failed to compute cache key: "/assets" not found: not found
What I expected
- the
.dockerignore to exclude the files when using COPY / ADD, but RUN --mount to have access to files in the build-context.
- a clearer error in case of a failure;
- "failed to compute cache key" is confusing, and feels like an implementation detail that's not of interest to the end-user
- "/assets" not found: not found; "not found" is included twice in the error
- "/assets" not found: not found; "not found" does not mention that the
/assets path is excluded
This may be (somewhat) expected, but thought I'd open a ticket, because I can see use-cases where this functionality would be useful.
Description
I'm trying to exclude paths in the build-context (through
.dockerignore), to prevent those paths from being included in the image that is built. However, some steps make use of the excluded files, and to provide access, I'm usingRUN --mount, to "overlay" the excluded files.Prepare
Without dockerignore
Build the Dockerfile, and notice that the
assetsdirectory is successfully mountedWith a
.dockerignoreCreate a
.dockerignoreto exclude theassetsdirectory fromCOPY:echo "/assets/" > Dockerfile.dockerignoreBuild the image again;
What I expected
.dockerignoreto exclude the files when usingCOPY/ADD, butRUN --mountto have access to files in the build-context./assetspath is excluded