Generator Dockerfile multistage
Etap build i mały obraz runtime dla czterech popularnych stosów
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Puste pole wybiera bezpieczną domyślną komendę w formie exec.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator Dockerfile multistage — build oddzielony od runtime
Generator Dockerfile multistage przygotowuje dwa wyspecjalizowane etapy dla PHP, Node.js, Pythona albo Go. Kompilatory i zależności deweloperskie zostają w obrazie build, a finalny etap otrzymuje tylko kod, artefakty oraz biblioteki potrzebne do uruchomienia aplikacji.
Wybierz stos i wspieraną wersję obrazu, nazwę aplikacji, katalog roboczy i port. Domyślny wynik uruchamia proces jako non-root, używa exec form dla CMD i dodaje próbę zdrowia dopasowaną do runtime. Prostszy, jednoetapowy punkt wyjścia znajdziesz w generatorze Dockerfile.
Co naprawdę trafia do obrazu końcowego
| Stos | Etap build | Etap runtime |
|---|---|---|
| PHP-FPM | Composer instaluje vendor i optymalizuje autoload | kod z vendor, PHP-FPM, PDO MySQL i OPcache |
| Node.js | npm ci oraz npm run build | katalog dist i zależności --omit=dev |
| Python | virtualenv, requirements i kompilacja bytecode | virtualenv oraz kod, bez narzędzi systemowych build |
| Go | pobranie modułów i statyczny plik binarny | Alpine, certyfikaty CA i jeden plik wykonywalny |
Cache zależności i powtarzalne buildy
Manifest zależności jest kopiowany przed kodem: composer.lock, package-lock.json, requirements.txt albo go.sum. Docker może wtedy wykorzystać kosztowną warstwę instalacji po zmianie pliku aplikacji. Zmiana lockfile celowo unieważnia cache i pobiera nowy zestaw pakietów.
Wybrane tagi wskazują konkretne, wspierane linie języka i wariant Alpine lub Slim; generator nie przyjmuje dowolnego tekstu w polu wersji. Tag nadal może zostać przesunięty przez wydawcę. Dla audytowalnej produkcji po testach przypnij każdy FROM do digestu, a aktualizacje digestów wykonuj automatycznym, recenzowanym pull requestem.
Bezpieczeństwo obrazu: non-root, sekrety i minimalny runtime
Właściciel plików i użytkownik procesu
PHP korzysta z istniejącego konta www-data, Node z konta node, Python tworzy systemowego użytkownika app, a Go robi to samo w Alpine. Instrukcje COPY --chown zapewniają dostęp do artefaktów bez późniejszego, kosztownego chown -R. Opcję non-root wyłączaj wyłącznie do świadomego debugowania obrazu.
Non-root nie naprawi zbyt szerokich uprawnień hosta. Nie montuj docker.sock, nie używaj --privileged i przydzielaj zapisywalny wolumen tylko tam, gdzie aplikacja go potrzebuje. Gdy obraz jest gotowy, parametry uruchomienia sprawdzisz w generatorze Docker Compose.
Sekrety nie należą do ARG ani ENV
ARG i ENV mogą pozostać w metadanych lub historii warstw. Pobieranie prywatnych pakietów realizuj przez BuildKit RUN --mount=type=secret albo --mount=type=ssh, a dane runtime dostarczaj przez mechanizm sekretów orchestratora.Generator nie tworzy żadnego pola na sekret i nie umieszcza przykładowego hasła. Plik .dockerignore powinien dodatkowo wykluczać .env, katalog .git, lokalne cache i wyniki testów. Wzorzec listy ignorowanych plików przygotuje generator .gitignore.
Jak użyć i sprawdzić wygenerowany Dockerfile
- Wybierz język. Zmiana presetu ustawia zgodny tag i port; PHP-FPM pozostaje na porcie 9000.
- Dopasuj nazwę modułu, katalog roboczy i ścieżkę artefaktu. W Node generator zakłada
dist/server.js. - Zapisz plik jako
Dockerfileoraz przygotuj mały.dockerignore. - Uruchom
docker build --pull -t app:test ., następnie przeskanuj obraz i obejrzyj historię warstw. - Wystartuj kontener bez roota, sprawdź logi, endpoint
/healthi zatrzymanie procesu sygnałem SIGTERM.
Healthcheck zależny od runtime
PHP-FPM nie obsługuje HTTP, dlatego próba używa cgi-fcgi i portu 9000. Node oraz Go korzystają z wget dostępnego w obrazie Alpine. Python odpytuje HTTP modułem urllib ze standardowej biblioteki, więc nie instaluje programu curl. Dla aplikacji HTTP dostosuj ścieżkę /health; jeśli proces jest workerem, zastąp próbę kontrolą kolejki lub wyłącz ją.
CMD w exec form i własna komenda
Domyślne polecenia powstają jako tablica JSON, dzięki czemu proces aplikacji otrzymuje sygnały bez pośredniej powłoki. Jeśli wpiszesz własne CMD, generator jawnie zapisze ["sh","-c",…], poprawnie ucieknie cudzysłowy i odrzuci znaki sterujące. To umożliwia potoki, ale odpowiedzialność za bezpieczną składnię pozostaje po stronie autora obrazu.
Przed wdrożeniem sprawdź także uprawnienia katalogów, np. w kalkulatorze chmod, i ustaw limity CPU/pamięci w orchestratorze. Wieloetapowy build zmniejsza powierzchnię ataku, lecz nie zastępuje skanowania zależności i regularnego odświeżania obrazów bazowych.
Najczęściej zadawane pytania
Dlaczego etap Node kopiuje tylko dist?
Etap runtime powinien dostać skompilowany rezultat, a nie źródła i narzędzia deweloperskie. Jeśli framework używa katalogu build albo .next, zmień obie ścieżki COPY i domyślne CMD.
Czy obraz Alpine zawsze jest najlepszy?
Nie. Jest mały, ale używa musl zamiast glibc i nie każdy natywny pakiet ma zgodne binaria. Gdy zależność tego wymaga, wybierz wariant Debian Slim i zachowaj ten sam podział etapów.
Po co kopiować virtualenv Pythona?
Dzięki temu kompilatory potrzebne do zbudowania pakietów zostają w etapie build. Runtime otrzymuje gotowe biblioteki pod /opt/venv oraz kod należący do użytkownika app.
Czy healthcheck uruchomi ponownie kontener?
Sam Docker oznacza go jako unhealthy, ale decyzja o restarcie zależy od Compose lub orchestratora. Próba powinna być szybka, lokalna i sprawdzać zdolność procesu do obsługi ruchu.
Jak przekazać token do prywatnego rejestru pakietów?
Użyj sekretu BuildKit dostępnego tylko w pojedynczej instrukcji RUN. Nie kopiuj pliku konfiguracyjnego z tokenem i nie zapisuj go w ARG, bo może zostać w historii obrazu.