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.

Rowanto
źródło
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
Mauricio Sánchez
źródło
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.

obfity
źródło
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.

Jay Atkinson
źródło
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