Dockerignore: zignoruj ​​wszystko oprócz pliku i pliku Dockerfile


89

Dlatego głównym zamiarem było dokeryzowanie aplikacji typu słoik tłuszczu i umieszczenie jej w łodydze Elasticbean. Problem tkwi w kontekście. Trochę głupio jest dodawać tak dużo kontekstu do dockera, jeśli wszystko, czego potrzebuję, to w rzeczywistości pojedynczy plik jar.

Bawiłem się plikiem .dockerignore, ale zgubiłem się. Próbowałem użyć negacji gitignore, ale to nie działa.

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

Jest też coś takiego w przypadku wyrażenia regularnego, ale wygląda na to, że skomplikowane wyrażenie regularne nie jest obsługiwane.

^((?!Dockerfile).)*$

Próbowałem również szukać w stackoverflow i te dwa to wszystko, co znalazłem:

To pytanie może być podobne do drugiego, ale myślę, że jest to niewielka różnica, ponieważ w tym miejscu chcę tylko dołączyć pojedynczy plik do kontekstu.

Każda pomoc zostanie doceniona.


Wykrzyknik dla folderów działa dla mnie!
Ivan Aracki

Odpowiedzi:


127

Jeśli chcesz zignorować wszystko oprócz niektórych katalogów lub plików, a także zignorować niepotrzebne pliki w tych dozwolonych katalogach, możesz użyć następującego .dockerignorepliku:

# 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
Zgodnie z dokumentacją Dockera powinno wystarczyć umieszczenie tylko *w pierwszej linii (zamiast **). Cytat: „możesz chcieć określić, które pliki mają być uwzględnione w kontekście, a nie które mają być wykluczone. Aby to osiągnąć, określ *jako pierwszy wzorzec, a po nim jeden lub więcej !wzorców wyjątków”.
Johnny Thunderman,

31

Z odwołania do pliku dockerfile :

Poza regułami ścieżki pliku.Match poza Go, Docker obsługuje również specjalny ciąg znaków wieloznacznych **, który pasuje do dowolnej liczby katalogów (w tym zera). Na przykład ** / *. Go wykluczy wszystkie pliki kończące się na .go, które znajdują się we wszystkich katalogach, w tym w katalogu głównym kontekstu kompilacji.

Tak więc wiersz zawierający po prostu ** zignoruje wszystko w tym samym katalogu co plik Dockerfile.

Zgodnie z oczekiwaniami, wykrzyknik może być następnie użyty do odniesienia się do plików, które chcesz wysłać do demona Dockera.


3
Niezwykle ważne **jest, aby plik trafiał na początek pliku, w przeciwnym razie wykluczenia zostaną zignorowane. Docker używa ostatniej pasującej reguły jako reguły „końcowej”, więc jeśli **jest ostatnią, dopasuje wszystko.
tedivm

3
Więc dodaj **w pierwszej linii i !foow następnej, jeśli foojest to jedyny plik, który chcesz dołączyć.
Saca

9

Może to zabrzmieć dziwnie, ale jeśli potrzebujesz tylko jednego pliku jar, możesz utworzyć folder „docker” w systemie kompilacji, który zawiera plik Dockerfile. Po uruchomieniu kompilacji, skrypty kompilacji skopiuj pojedynczy plik jar do „docker”, a następnie wykonaj kompilację obrazu Dockera (z wnętrza folderu „docker”) i po zakończeniu wypchnij do rejestru Dockera.


2
Cześć, to wcale nie brzmi dziwnie. Myślałem, że to ogólna praktyka, ale szukałem sposobu, aby to zrobić z .dockerignore, jeśli to możliwe. Poza tym nie lubię mvn xml :)
Rowanto

Możesz połączyć oba podejścia, umieszczając plik dockerfile w podkatalogu i używając .dockerignore. Według dokumentacji i tak dobrze jest to zrobić
Jonathan Lee

Dokumentacja Dockera: w większości przypadków najlepiej jest rozpocząć od pustego katalogu jako kontekstu i zachować w tym katalogu plik Dockerfile. Dodaj tylko pliki potrzebne do zbudowania pliku Dockerfile. Ostrzeżenie: nie używaj swojego katalogu głównego /, jako ŚCIEŻKI, ponieważ powoduje to, że kompilacja przenosi całą zawartość dysku twardego do demona Dockera.
Jonathan Lee
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.