Dockerignore: игнорировать все, кроме файла и Dockerfile.

89

Итак, основная цель заключалась в том, чтобы докеризовать приложение fat jar и поместить его в Elasticbeanstalk. Проблема в контексте. Немного глупо добавлять так много контекста в докер, если все, что мне нужно, это единственный файл jar.

Я играл с файлом .dockerignore, но я потерялся. Я пытался использовать отрицание gitignore, но это не сработало.

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

То же самое и с регулярным выражением, но похоже, что сложное регулярное выражение не поддерживается.

^((?!Dockerfile).)*$

Я также пробовал искать в stackoverflow, и это все, что я нашел:

Этот вопрос может быть похож на второй, но я думаю, что это небольшая разница, поскольку здесь я просто хочу включить один файл в контекст.

Любая помощь будет оценена по достоинству.

Рованто
источник
Восклицательный знак для папок у меня работает!
Иван Арацки

Ответы:

127

Если вам нужно игнорировать все, кроме некоторых каталогов или файлов, а также игнорировать некоторые ненужные файлы внутри этих разрешенных каталогов, вы можете использовать следующий .dockerignoreфайл:

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db
Маурисио Санчес
источник
8
Согласно документации Docker этого должно хватить только *на первую строку (вместо **). Цитата: «вы можете указать, какие файлы включать в контекст, а не какие исключать. Для этого укажите *в качестве первого шаблона, за которым следует один или несколько !шаблонов исключения».
Джонни
31

Из ссылки на файл докеров :

Помимо правил Filepath.Match в Go, Docker также поддерживает специальную строку с подстановочными знаками **, которая соответствует любому количеству каталогов (включая ноль). Например, ** / *. Go исключит все файлы, заканчивающиеся на .go и находящиеся во всех каталогах, включая корень контекста сборки.

Таким образом, строка, содержащая просто **, будет игнорировать все, что находится в том же каталоге, что и файл Docker.

Как и ожидалось, восклицание можно использовать для ссылки на любые файлы, которые вы хотите отправить демону докера.

изобиловать
источник
3
Чрезвычайно важно, чтобы он **шел в начало файла, иначе исключения будут проигнорированы. Docker использует последнее подходящее правило как «последнее» правило, поэтому, если **оно последнее, оно будет соответствовать всему.
tedivm 03
3
Поэтому добавьте **в первую строку и !fooв следующую строку, если fooэто единственный файл, который вы хотите включить.
Saca
9

Это может показаться странным, но если все, что вам нужно, - это один файл jar, вы можете создать в своей системе сборки папку «docker», содержащую ваш Dockerfile. Когда вы запускаете свои сборки, попросите сценарии сборки скопировать один файл jar в «докер», затем выполнить сборку образа докера (из папки «докер») и по завершении отправить в реестр докеров.

Джей Аткинсон
источник
2
Привет, это совсем не странно. Я думал, что это обычная практика, но я искал способ сделать это с помощью .dockerignore, если возможно. Кроме того, мне не очень нравится mvn xml :)
Rowanto
Вы можете объединить оба подхода, поместив файл dockerfile в подкаталог и используя .dockerignore. Согласно документам, в любом случае это хорошо
Джонатан Ли,
Документация Docker : в большинстве случаев лучше всего начинать с пустого каталога в качестве контекста и хранить свой Dockerfile в этом каталоге. Добавьте только файлы, необходимые для сборки Dockerfile. Предупреждение. Не используйте корневой каталог / в качестве ПУТИ, так как он заставляет сборку передавать все содержимое вашего жесткого диска демону Docker.
Джонатан Ли