所以,我有一个虚拟项目,其文件结构如下所示:
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
我的 Dockerfile 看起来像这样:
FROM ubuntu:latest as builder
WORKDIR /workdir
COPY ./ ./
RUN find . -type f
ENTRYPOINT ["echo", "wow"]
我使用命令构建此图像docker build . -t docker-magic:test --no-cache以避免缓存结果。
这个想法很简单 - 我将文件docker-magic夹中的所有文件复制到我的图像中,然后通过find . -type f.
我也想忽略一些文件。我用一个.dockerignore文件来做到这一点。根据官方 Docker 文档:
的摆放位置!异常规则会影响行为:与特定文件匹配的 .dockerignore 的最后一行决定了它是包含还是排除。
让我们考虑以下内容.dockerignore:
**/*.go
它应该排除所有 .go 文件。确实如此!我从 find 中得到以下内容:
./.dockerignore
./src/folder_one/what_again.sh
./src/folder_two/what.kts
./just_a_file
./Dockerfile
接下来,让我们忽略一切。.dockerignore就是现在:
**/*
而且,正如预期的那样,我从 find 得到空输出。
现在变得困难了。我想忽略除 .go 文件之外的所有文件。根据文档,它将如下:
**/*
!**/*.go
但我从 find 中得到以下输出:
./top_level.go
这显然不是预期的,因为正如我们所见,其他 .go 文件也匹配此模式。如何获得我想要的结果 - 仅将 .go 文件复制到我的图像?
编辑:我的 Docker 版本是20.10.5, build 55c4c88.