Generator Dockerfile

Dockerfile
Wyniki

Dockerfile to jeden z tych plików, które wydają się krótkie, dopóki nie przypomnisz sobie szczegółów: kolejność warstw ma znaczenie dla cache, COPY package.json idzie przed RUN npm install, a języki kompilowane korzystają z budowania wieloetapowego. Ten generator zapisuje gotowy Dockerfile dla wybranej technologii, z już poprawnym wzorcem cache.

Jak wygenerować Dockerfile

  1. 1

    Wybierz technologię

    Node.js, Python, PHP, Go lub Rust. Każdy szablon używa sensownego obrazu bazowego dla danego języka i właściwego polecenia instalacji zależności.

  2. 2

    Ustaw katalog roboczy i port

    Wybierz WORKDIR i port, na którym nasłuchuje Twoja aplikacja; obie wartości trafią do wygenerowanego pliku.

  3. 3

    Przejrzyj Dockerfile

    Sprawdź, czy linia EXPOSE i polecenie startowe pasują do Twojej aplikacji. Szablony Go i Rust używają budowania wieloetapowego.

  4. 4

    Skopiuj Dockerfile

    Skopiuj wynik i wklej go do katalogu głównego repozytorium, a następnie zbuduj obraz.

Dlaczego budowanie wieloetapowe

Naiwny Dockerfile instaluje cały toolchain kompilatora w finalnym obrazie. Budowanie wieloetapowe daje etap “builder”, który kompiluje, oraz etap końcowy niosący tylko skompilowany artefakt:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

Obraz końcowy pozbywa się wszystkich zależności programistycznych, plików źródłowych i cache budowania, często zmniejszając swój rozmiar o 60-80 procent.

Warianty obrazu bazowego

Szablony używają obrazów slim lub alpine, gdzie to możliwe. Jeśli samodzielnie dostosowujesz obraz bazowy, typowe opcje to:

Wariant Typowy rozmiar Kiedy wybrać
full 300-900 MB Obrazy programistyczne, nietypowe zależności systemowe
slim 80-200 MB Standard produkcyjny dla większości języków
alpine 30-100 MB Małe obrazy, uwaga na problemy glibc vs musl
distroless 20-80 MB Maksymalne bezpieczeństwo; brak powłoki i menedżera pakietów

Zasady cache warstw

Docker buforuje każdą linię; gdy zmienia się jedna warstwa, wszystko poniżej jest przebudowywane. Kolejność od najmniej do najbardziej zmiennej:

  1. Obraz bazowy FROM (rzadko się zmienia).
  2. Pakiety systemowe (apt-get install), rzadkie zmiany.
  3. Manifesty zależności (package.json, requirements.txt, composer.json).
  4. Etap instalacji zależności. Uruchamia się tylko, gdy zmienia się manifest.
  5. Kopiowanie kodu źródłowego. Najbardziej obciążona warstwa; wszystko po niej jest przebudowywane przy każdym commicie.
  6. Kompilacja i końcowy CMD.

Złamanie tej kolejności to najczęstsza przyczyna wolnych buildów CI.

Lista kontrolna bezpieczeństwa

  • Uruchamiaj jako nie-root. Ustaw USER appuser (lub USER 1000) blisko końca.
  • Przypinaj wersje. python:3.12.7-slim bije python:3.12, które bije python:latest.
  • Ustaw jawny WORKDIR zamiast polegać na /.
  • Używaj COPY, nie ADD do plików lokalnych; ADD ma skutki uboczne automatycznego rozpakowywania.
  • Dodaj HEALTHCHECK, aby orkiestratorzy mogli wykryć zablokowany proces.
  • Czyść cache pakietów w tej samej linii RUN: apt-get install ... && rm -rf /var/lib/apt/lists/*.

Najczęściej zadawane pytania

Slim jest bezpieczniejszym domyślnym wyborem, ponieważ nadal opiera się na glibc, jak większość prekompilowanych wheeli bibliotek. Alpine używa musl i czasem powoduje tajemnicze błędy uruchomieniowe w Pythonie (pandas, numpy) lub Node (natywne moduły node-gyp). Wybierz alpine, gdy rozmiar obrazu ma kluczowe znaczenie i przetestowałeś technologię.

Tak, dodaj go do swojego projektu. Bez niego Docker wysyła całe repozytorium do demona jako kontekst budowania: historię git, node_modules, lokalne pliki .env, testy. To wolne, marnuje cache i ujawnia sekrety.

Tak. Użyj docker buildx z opcją --platform, aby budować dla obu architektur naraz. Obrazy bazowe używane przez szablony publikują warianty arm64.

Nie. Wybory technologii, katalogu roboczego i portu służą tylko do wygenerowania Dockerfile na tej stronie; nic nie jest zapisywane ani udostępniane.

Powiązane narzędzia

Narzędzie jest dostępne w innych językach