DevOps i automatyzacja Średnio zaawansowany 55 min

Budowanie obrazów: kontekst, .dockerignore i cache

Ograniczysz kontekst budowania i wykorzystasz cache bez ukrywania zmian w zależnościach.

Wróć do listy lekcji

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

Dodaj do projektu 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.

Flow nauki
  1. Teoria
  2. Przykład
  3. Ćwiczenie
  4. Quiz
  5. Praktyka
  6. Podsumowanie