How do I exclude everything except .go files in .dockerignore?

577 Views Asked by At

So, I have a dummy project, which file structure looks like this:

docker-magic
├── Dockerfile
├── .dockerignore
├── just_a_file
├── src
│   ├── folder_one
│   │   ├── main.go
│   │   └── what_again.sh
│   ├── folder_two
│   │   └── what.kts
│   └── level_one.go
└── top_level.go

My Dockerfile looks like this:

FROM ubuntu:latest as builder

WORKDIR /workdir

COPY ./ ./

RUN find . -type f

ENTRYPOINT ["echo", "wow"]

I build this image with a docker build . -t docker-magic:test --no-cache command to avoid caching results.

The idea is simple - I copy all of the files from docker-magic folder into my image and then list all of them via find . -type f.

Also I want to ignore some of the files. I do that with a .dockerignore file. According to the official Docker docs:

The placement of ! exception rules influences the behavior: the last line of the .dockerignore that matches a particular file determines whether it is included or excluded.

Let's consider following contents of .dockerignore:

**/*.go

It should exclude all the .go files. And it does! I get following contents from find:

./.dockerignore
./src/folder_one/what_again.sh
./src/folder_two/what.kts
./just_a_file
./Dockerfile

Next, let's ignore everything. .dockerignore is now:

**/*

And, as expected, I get empty output from find.

Now it gets difficult. I want to ignore all the files except .go files. According to the docs, it would be the following:

**/*

!**/*.go

But I get the following output from find:

./top_level.go

Which is obviously not what is expected, because other .go files, as we have seen, also match this pattern. How do I get the result I wanted - copying only .go files to my image?

EDIT: my Docker version is 20.10.5, build 55c4c88.

0

There are 0 best solutions below