Dockerfile

Plik tekstowy opisujący krok po kroku, jak zbudować obraz kontenera Docker. Zawiera wszystkie komendy potrzebne do skonfigurowania aplikacji.

Dockerfile to zwykły plik tekstowy (bez rozszerzenia, dosłownie nazywa się Dockerfile), w którym opisujesz krok po kroku przepis na zbudowanie obrazu kontenera Docker. Każda linia to instrukcja: od czego zaczynasz, co skopiować do środka, co zainstalować i co ma się uruchomić, gdy kontener wystartuje. Można o tym myśleć jak o przepisie kuchennym — tyle że zamiast ciasta na końcu masz powtarzalny, identyczny obraz aplikacji, który zadziała tak samo na Twoim laptopie i na serwerze.

Jak to działa

Polecenie docker build czyta Dockerfile od góry do dołu i wykonuje kolejne instrukcje. Każda z nich tworzy osobną warstwę (layer), a Docker te warstwy cache’uje. Dzięki temu, jeśli zmienisz tylko kod aplikacji, a zależności zostały bez zmian, ponowny build pójdzie błyskawicznie — Docker odtworzy gotowe warstwy z cache i przeliczy tylko to, co faktycznie się zmieniło.

Najczęstsze instrukcje to: FROM (obraz bazowy, np. node:20), WORKDIR (katalog roboczy), COPY (kopiowanie plików do obrazu), RUN (wykonanie komendy w trakcie budowania, np. instalacja paczek), EXPOSE (informacja o porcie) oraz CMD lub ENTRYPOINT (co odpalić po starcie kontenera).

Przykład z praktyki

Prosty Dockerfile dla aplikacji Node.js wygląda mniej więcej tak: FROM node:20-alpine, potem WORKDIR /app, dalej COPY package*.json ./ i RUN npm ci, następnie COPY . ., a na końcu CMD ["node", "index.js"]. Budujesz to komendą docker build -t moja-apka . (kropka to kontekst, czyli bieżący katalog), a uruchamiasz przez docker run -p 3000:3000 moja-apka.

Zwróć uwagę na kolejność: package.json kopiujesz i instalujesz zależności przed skopiowaniem reszty kodu. To nie przypadek — dzięki temu cache zależności nie unieważnia się przy każdej zmianie w kodzie.

Częste błędy

Klasyk to wrzucanie wszystkiego do obrazu, łącznie z node_modules, .git i sekretami — od tego jest plik .dockerignore, używaj go. Drugi grzech: każda komenda w osobnym RUN zamiast łączenia ich w jeden (więcej warstw, większy obraz). Trzeci: hardcodowanie haseł i kluczy w Dockerfile — one wylądują w warstwach obrazu i każdy je odczyta. Do tego nie myl Dockerfile z docker-compose.yml — pierwszy buduje pojedynczy obraz, drugi orkiestruje uruchamianie wielu kontenerów naraz.

Pojęcia powiązane

Image, kontener, warstwa (layer), docker build, .dockerignore, multi-stage build, Docker Compose, registry (np. Docker Hub).