-
Notifications
You must be signed in to change notification settings - Fork 18.9k
Verify parity between .dockerignore and .gitignore syntax #40318
Description
related:
- .dockerignore with '*' wildcard doesn't work as documented docker/for-linux#585
- [epic] builder: collected issues on improving .dockerignore #40319
- COPY failing with not found and/or skipping arbitrary files, folders when using wildcards buildkit#4132
Description
When building images, sometimes ** will be matched, other times it'll be ignored.
Changing .dockerignore line, might influence matching of later lines.
Steps to reproduce the issue:
Run following script:
Notice, that last line of .dockerignore is matched the second time, but it isn't matched the first time.
#!/usr/bin/env bash
set -euo pipefail
dockerignore() {
(
# There is a bug in docker standard build kit - this seems to fix it
export DOCKER_BUILDKIT=1
docker build --no-cache -t build-context -f - . 2>/dev/null <<EOF
FROM busybox
COPY . /build-context
WORKDIR /build-context
CMD find .
EOF
docker run --rm build-context
docker image rm build-context > /dev/null
)
}
msg() {
printf '##### %s #####\n' "${*}"
}
tmpdir="$(mktemp -d)"
trap 'rm -rf "${tmpdir}"' EXIT
cd "${tmpdir}"
mkdir -p nested-dir
touch {nested-dir/,}something.{allow,ignore}{1,2}
msg 'Real folder structure:'
find .
msg 'Applying first .dockerignore config:'
tee .dockerignore <<BUGGED
*
!something.allow1
!something.allow2
!**/something.allow1
!**/something.allow2
BUGGED
msg 'Contents in first docker image:'
dockerignore
msg 'Applying second .dockerignore config:'
tee .dockerignore <<BUGGED
*
!something.allow1
!something.allow2
!nested-dir/something.allow1
!**/something.allow2
BUGGED
msg 'Contents in second docker image:'
dockerignoreDescribe the results you received:
When using first .dockerignore contents, files I wanted to include from nested-dir/ are not included.
##### Real folder structure: #####
.
./something.ignore2
./something.allow2
./nested-dir
./nested-dir/something.ignore2
./nested-dir/something.allow2
./nested-dir/something.ignore1
./nested-dir/something.allow1
./something.ignore1
./something.allow1
##### Applying first .dockerignore config: #####
*
!something.allow1
!something.allow2
!**/something.allow1
!**/something.allow2
##### Contents in first docker image: #####
.
./something.allow2
./something.allow1
##### Applying second .dockerignore config: #####
*
!something.allow1
!something.allow2
!nested-dir/something.allow1
!**/something.allow2
##### Contents in second docker image: #####
.
./something.allow2
./nested-dir
./nested-dir/something.allow2
./nested-dir/something.allow1
./something.allow1
Describe the results you expected:
** should always match any number of directories (including zero) as per documentation.
After using the first .dockerignore contents, docker context should have selected files from nested-dir/
##### Real folder structure: #####
.
./something.ignore2
./something.allow2
./nested-dir
./nested-dir/something.ignore2
./nested-dir/something.allow2
./nested-dir/something.ignore1
./nested-dir/something.allow1
./something.ignore1
./something.allow1
##### Applying first .dockerignore config: #####
*
!something.allow1
!something.allow2
!**/something.allow1
!**/something.allow2
##### Contents in first docker image: #####
.
./something.allow2
./nested-dir
./nested-dir/something.allow2
./nested-dir/something.allow1
./something.allow1
##### Applying second .dockerignore config: #####
*
!something.allow1
!something.allow2
!nested-dir/something.allow1
!**/something.allow2
##### Contents in second docker image: #####
.
./something.allow2
./nested-dir
./nested-dir/something.allow2
./nested-dir/something.allow1
./something.allow1
Additional information you deem important (e.g. issue happens only occasionally):
Output of docker version:
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea838
Built: Wed Nov 13 07:29:52 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
Git commit: 633a0ea838
Built: Wed Nov 13 07:28:22 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.10
GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
runc:
Version: 1.0.0-rc8+dev
GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
docker-init:
Version: 0.18.0
GitCommit: fec3683
Output of docker info:
Client:
Debug Mode: false
Server:
Containers: 6
Running: 0
Paused: 0
Stopped: 6
Images: 139
Server Version: 19.03.5
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
init version: fec3683
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-72-generic
Operating System: Linux Mint 19.2
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.16GiB
Name: Limonka
ID: W7BY:I3ZZ:YGXV:G2PZ:4YIR:WKID:NEJR:E35Z:466L:NLT6:MKYF:ES52
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
Additional environment details (AWS, VirtualBox, physical, etc.):