Budowanie obrazów: kontekst, .dockerignore i cache
Ograniczysz kontekst budowania i wykorzystasz cache bez ukrywania zmian w zależnościach.
1. Krótka teoria
Ostatnia kropka w docker build -t orders-api:local . wskazuje kontekst budowania. Instrukcja COPY może odczytać tylko pliki dostępne w tym kontekście. Przesłanie całego repozytorium wraz z .git, lokalną bazą i plikami środowiskowymi jest niepotrzebne oraz ryzykowne. .dockerignore wyklucza takie ścieżki przed budową; nie zastępuje jednak .gitignore. Docker korzysta z cache warstw, gdy instrukcja i jej wejście nie zmieniły się. Dlatego najpierw kopiuj requirements.txt i instaluj zależności, a dopiero później kopiuj częściej zmieniany kod. Zmiana kodu nie powinna wtedy ponownie instalować pakietów. Zmiana pliku zależności musi tę warstwę unieważnić. Opcja --no-cache wymusza pełną przebudowę, ale nie jest domyślnym rozwiązaniem problemów. docker image inspect i docker history pomagają obejrzeć wynik. Do wydania produkcyjnego potrzebny jest kontrolowany tag lub digest oraz sprawdzenie, czy w obrazie nie ma prywatnych plików.
2. Przykłady komend
docker build -t orders-api:local .
Buduje obraz z bieżącego katalogu jako kontekstu.
$ docker build -t orders-api:local .
cat .dockerignore
Pozwala sprawdzić reguły wykluczania plików z kontekstu.
$ cat .dockerignore
.git
.venv
__pycache__
.env
app/data
docker build --progress=plain -t orders-api:local .
Pokazuje szczegółowy przebieg budowy i użycie cache.
$ docker build --progress=plain -t orders-api:local .
docker build --no-cache -t orders-api:rebuild .
Buduje bez cache, gdy świadomie trzeba odtworzyć wszystkie kroki.
$ docker build --no-cache -t orders-api:rebuild .
docker history orders-api:local
Pokazuje warstwy końcowego obrazu.
$ docker history orders-api:local
docker image inspect orders-api:local
Odczytuje metadane i identyfikator zbudowanego obrazu.
$ docker image inspect orders-api:local
3. Zadanie praktyczne
orders-api plik .dockerignore z wykluczeniem .git, .venv, __pycache__, .env i lokalnych danych. Zbuduj obraz dwa razy z --progress=plain, zmień tylko kod aplikacji i zbuduj ponownie. Zapisz, które kroki użyły cache, a które się powtórzyły. Potem zmień requirements.txt i wyjaśnij różnicę.
4. Typowe błędy
- Wysyłanie sekretów i lokalnych danych do kontekstu budowania.
- Zakładanie, że .gitignore automatycznie zastępuje .dockerignore.
- Kopiowanie całego projektu przed instalacją zależności.
- Używanie --no-cache przy każdej budowie bez potrzeby.
5. Podsumowanie
Kontekst określa, które pliki może widzieć budowa. .dockerignore ogranicza jego rozmiar i ryzyko wycieku. Dobra kolejność COPY i RUN pozwala wykorzystywać cache zależności bez pomijania rzeczywistych zmian.