Skip to content

Verify parity between .dockerignore and .gitignore syntax  #40318

@sbienkow

Description

@sbienkow

related:

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:'
dockerignore

Describe 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.):

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/builderBuildkind/enhancementEnhancements are not bugs or new features but can improve usability or performance.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions