Dockerignore: Ігноруйте все, крім файлу та Dockerfile


89

Отже, головним наміром було закріпити аплікацію з жирових банок і покласти її в Elasticbeanstalk. Проблема в контексті. Трохи нерозумно додавати стільки контексту в докер, якщо все, що мені потрібно, - це фактично один файл jar.

Я бавився з файлом .dockerignore, але я загубився. Я намагався використати заперечення gitignore, але це не працює.

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

Існує також така річ із регулярним виразом, але, схоже, складний регулярний вираз не підтримується.

^((?!Dockerfile).)*$

Я також спробував шукати в stackoverflow, і ось ці два я знайшов:

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

Будь-яка допомога буде вдячна.


Для мене працює знак оклику для папок!
Ivan Aracki

Відповіді:


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

З посилання на файл докер :

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

Отже, рядок, що містить просто **, буде ігнорувати все в тому ж каталозі, що і Dockerfile.

Як очікувалося, вигук може бути використаний для посилання на будь-які файли, які ви бажаєте надіслати до демона докера.


3
Надзвичайно важливо, щоб **перехід відбувся у верхній частині файлу, інакше виключення будуть проігноровані. Docker використовує останнє правило, яке відповідає як "остаточне" правило, тому, якщо **воно останнє, воно буде відповідати усьому.
tedivm

3
Тож додайте **на першому та !fooнаступному рядках, якщо fooце єдиний файл, який ви хочете включити.
Сака

9

Це може здатися дивним, але якщо вам потрібен лише один файл jar, ви можете створити папку "docker" у вашій системі складання, яка містить ваш файл Docker. Коли ви запускаєте свої збірки, попросіть сценарії збірки скопіювати один файл jar у "docker", а потім виконайте збірку образу docker (зсередини папки "docker") і після завершення натисніть у свій реєстр docker.


2
Привіт, це зовсім не звучить дивно. Я думав, що це загальна практика, але шукав спосіб зробити це за допомогою .dockerignore, якщо це можливо. До того ж я не дуже люблю mvn xml :)
Рованто

Ви можете поєднати обидва підходи, помістивши файл docker у підкаталог та використовуючи .dockerignore. Згідно з документами, це добре робити в будь-якому випадку
Джонатан Лі

Документація Docker : У більшості випадків найкраще починати з порожнього каталогу як контексту і зберігати файл Docker у цьому каталозі. Додайте лише файли, необхідні для створення Dockerfile. Попередження: Не використовуйте свій кореневий каталог /, як PATH, оскільки він змушує збірку передати весь вміст жорсткого диска в демон Docker.
Джонатан Лі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.