Kratak odgovor
Kada se Docker kontejner odmah ugasi, prvo proverite `docker logs` i exit kod. Najčešći uzroci su pogrešna startna komanda, aplikacija koja završi odmah, nedostajuća konfiguracija ili dozvola, i kontejner koji nema šta da radi u prvom planu. Ispravite komandu ili entrypoint i pokrenite kontejner interaktivno da vidite grešku.
Kako se problem prepoznaje
- `docker ps` ne prikazuje kontejner, a `docker ps -a` ga vodi kao Exited
- Kontejner se pokrene pa nestane u roku od nekoliko sekundi
- U logovima nema ničega ili samo poruka o grešci pri startu
- Aplikacija radi lokalno, ali u kontejneru odmah izađe
- Exit kod je 0, 1, 127 ili 137
Najčešći uzroci
Pogrešna startna komanda ili entrypoint
Ako je u Dockerfile-u ili `docker run` komandi navedena nepostojeća komanda, kontejner izlazi sa kodom 127. Proverite da li je putanja do izvršnog fajla ispravna i da li je komanda u formatu koji Docker očekuje.
Aplikacija završi odmah
Kontejner živi dok god glavni proces radi. Ako aplikacija samo odradi nešto i završi, ili ako je pokrenuta u pozadini, kontejner će se ugasiti. Potrebno je da glavni proces ostane u prvom planu.
Nedostaje konfiguracija ili dozvola
Aplikacija može pasti ako nema promenljive okruženja, fajl konfiguracije ili dozvolu za upis. U logovima se tada vidi greška pri startu, na primer da baza nije dostupna ili da fajl ne postoji.
Port ili resursi
Ako je port zauzet, pokretanje može da ne uspe uz poruku da je port već zauzet. Kontejner može da izađe i ako nema dovoljno memorije ili ako je proces ubijen zbog ograničenja.
Zavisnost između servisa
U Docker Compose okruženju kontejner može da ne startuje ili da izađe ako servis od kog zavisi nije spreman. Proverite redosled i uslove u `depends_on`, a healthcheck koristite da proverite da li je zavisni servis zaista spreman.
Rešenje korak po korak
- 1
Proverite status i exit kod
Pokrenite
docker ps -ada vidite sve kontejnere, uključujući ugašene. Obratite pažnju na kolonu STATUS i na exit kod. Kod 0 znači da je proces završio normalno, 1 je opšta greška, 127 nepostojeća komanda, a 137 ukazuje na prisilno zaustavljanje, često zbog memorije. - 2
Pregledajte logove
Pokrenite
docker logs <ime_ili_id>. Ako je kontejner ugašen, dodajte--tail 100da vidite poslednjih sto linija. Logovi najčešće sadrže tačan razlog, na primer grešku u konfiguraciji ili poruku da komanda nije pronađena. - 3
Pokrenite kontejner interaktivno
Zaobilazite startnu komandu i uđite u ljusku:
docker run -it --entrypoint /bin/sh <slika>. Ako slika nemash, probajtebash. Unutar kontejnera ručno pokrenite aplikaciju i vidite grešku koju inače ne vidite. - 4
Proverite komandu i entrypoint
Pogledajte Dockerfile i
docker runkomandu. Uverite se da jeCMDiliENTRYPOINTu ispravnom formatu i da putanja do izvršnog fajla postoji. Ako koristitedocker compose, proverite poljecommandudocker-compose.yml. - 5
Uverite se da glavni proces ostaje u prvom planu
Aplikacija ne sme da se pokreće u pozadini niti da završi odmah. Ako je u pitanju skripta, dodajte na kraj petlju ili pokrenite server koji sluša. Za kontejnere koji samo treba da ostanu aktivni, koristite
tail -f /dev/nullkao privremeno rešenje. - 6
Proverite promenljive okruženja i konfiguraciju
Uporedite
docker inspect <kontejner>sa onim što aplikacija očekuje. Nedostajuće promenljive dodajte kroz-eili uenvironmentsekciji. Proverite i da li su fajlovi konfiguracije montirani na ispravnu putanju. - 7
Proverite dozvole i vlasništvo
Ako aplikacija piše u volumen ili folder, uverite se da korisnik unutar kontejnera ima dozvolu. U
docker rundodajte--userili prilagodite Dockerfile. Greške sa dozvolama često se vide u logovima kaoPermission denied. - 8
Isključite healthcheck i zavisnosti
Ako koristite Compose, privremeno komentarišite
healthcheckidepends_onda vidite da li kontejner samostalno radi. Zatim ih vraćajte jednu po jednu i posmatrajte ponašanje. - 9
Ponovo izgradite sliku
Ako ste menjali Dockerfile, pokrenite
docker build --no-cache -t <ime> .pa ponovo pokrenite kontejner. Keširani sloj može da sakrije izmenu koja je uzrok problema.
Ako ništa ne pomogne
Uključite detaljnije logovanje aplikacije i pokrenite je sa docker run bez -d da vidite izlaz uživo. Proverite da li se kontejner gasi zbog OOMKilled u docker inspect (polje State.OOMKilled). Ako koristite Kubernetes ili drugi orkestrator, pogledajte događaje i restart count. Kada je problem u samoj aplikaciji, pokrenite je van kontejnera sa istim promenljivama okruženja da izolujete Docker. Za složene slučajeve sa više servisa, korisno je napraviti minimalni docker-compose.yml sa samo jednim servisom i postepeno dodavati ostale.
Kako da sprečite da se ponovi
- Uvek koristite `docker logs` i exit kod pre nego što menjate bilo šta.
- U Dockerfile-u eksplicitno navedite `CMD` ili `ENTRYPOINT` i testirajte ga lokalno.
- Povremeno čistite zaustavljene kontejnere, neiskorišćene mreže i dangling slike komandom `docker system prune`; pre pokretanja proverite šta će biti uklonjeno i napravite rezervnu kopiju važnih podataka.
- U Compose fajlu definišite healthcheck i `restart: unless-stopped` za servise koji treba da rade stalno.
Kada je bolje pozvati stručnjaka
Ako ste isprobali sve korake, a kontejner i dalje izlazi bez jasnog razloga, ili ako problem uključuje više servisa i produkcijsko okruženje, obratite se IT podršci da zajedno analizirate konfiguraciju i logove.
Razvoj softvera i proizvoda · Aplikacije po meri, SaaS i MVP za 4 do 8 nedeljaČesta pitanja
Zašto se kontejner gasi sa exit kodom 0?
Exit kod 0 znači da je glavni proces završio uspešno, ali to znači i da kontejner nema više šta da radi. Najčešće je aplikacija pokrenuta u pozadini ili je završila odmah. Rešenje je da glavni proces ostane u prvom planu.
Kako da vidim grešku koja se ne pojavljuje u logovima?
Pokrenite kontejner interaktivno sa `docker run -it --entrypoint /bin/sh <slika>` i ručno pokrenite aplikaciju. Tako ćete videti izlaz uživo. Možete i privremeno pokrenuti kontejner sa `sleep 3600` kao komandom, uz `--entrypoint` ako je potrebno, pa ući u njega i testirati.
Šta znači exit kod 137?
Kod 137 obično znači da je proces nasilno prekinut, najčešće zbog nedostatka memorije (OOM). Proverite `docker inspect` i polje `State.OOMKilled`. Povećajte memoriju ili optimizujte aplikaciju.