Как добавить все файлы/каталоги, кроме скрытого каталога, например.git в Dockerfile

Одной из вещей, которые мы часто делаем, является пакетный исходный код в Dockerfile когда мы создаем образ Docker.

ADD . /app

Как мы можем избежать включения каталога .git простым способом?

Я попробовал использовать Unix для обработки этого с помощью ADD [^.]*/app/

Полный образец:

[email protected]:/mnt/sda1/tmp/abc$ find .
.
./c
./.git
./Dockerfile
./good
./good/a1
[email protected]:/mnt/sda1/tmp/abc$ cat Dockerfile
FROM ubuntu

ADD [^.]* /app/
[email protected]:/mnt/sda1/tmp/abc$ docker build -t abc .
Sending build context to Docker daemon 4.096 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu
 ---> 04c5d3b7b065
Step 1 : ADD [^.]* /app/
d ---> 5d67603f108b
Removing intermediate container 60159dee6ac8
Successfully built 5d67603f108b
[email protected]:/mnt/sda1/tmp/abc$ docker run -it abc
[email protected]:/# ls -l app
total 4
-rw-r--r-- 1 1000 staff 30 Jan 22 01:18 Dockerfile
-rw-r--r-- 1 root root   0 Jan 22 01:03 a1
-rw-r--r-- 1 root root   0 Jan 22 00:10 c

А во-вторых, он потеряет структуру каталогов, так как good\a1 будет изменен на a1.

Исходный код в Docker - https://github.com/docker/docker/blob/eaecf741f0e00a09782d5bcf16159cc8ea258b67/builder/internals.go#L115

Ответ 1

Вы можете исключить нежелательные файлы с помощью файла.dockerignore

Ответ 2

Как мы можем избежать включения каталога.git простым способом?

Просто создайте файл с именем .dockerignore в корневой папке контекста со следующими строками

**/.git
**/node_modules

С такими строками Docker исключает каталоги .git и node_modules из любого подкаталога, включая root. Docker также поддерживает специальную подстановочную строку ** которая соответствует любому количеству каталогов (включая ноль).

А во-вторых, он потеряет структуру каталогов, так как good\a1 будет изменен на a1

С.dockerignore это не будет

$ docker run -it --rm sample tree /opt/
/opt/
├── Dockerfile
├── c
│   └── no_sslv2.patch
└── good
    └── a1
        └── README

3 directories, 3 files

Ссылка на официальные документы: .dockerignore

Ответ 3

Добавьте файл .dockerignore в корневой каталог (синтаксис, например, файл .gitignore)