Preskoči na sadržaj

Docker kontejner se odmah gasi: kako pronaći uzrok i popraviti

Srednje 15 min Ažurirano:

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. 1

    Proverite status i exit kod

    Pokrenite docker ps -a da 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. 2

    Pregledajte logove

    Pokrenite docker logs <ime_ili_id>. Ako je kontejner ugašen, dodajte --tail 100 da 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. 3

    Pokrenite kontejner interaktivno

    Zaobilazite startnu komandu i uđite u ljusku: docker run -it --entrypoint /bin/sh <slika>. Ako slika nema sh, probajte bash. Unutar kontejnera ručno pokrenite aplikaciju i vidite grešku koju inače ne vidite.

  4. 4

    Proverite komandu i entrypoint

    Pogledajte Dockerfile i docker run komandu. Uverite se da je CMD ili ENTRYPOINT u ispravnom formatu i da putanja do izvršnog fajla postoji. Ako koristite docker compose, proverite polje command u docker-compose.yml.

  5. 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/null kao privremeno rešenje.

  6. 6

    Proverite promenljive okruženja i konfiguraciju

    Uporedite docker inspect <kontejner> sa onim što aplikacija očekuje. Nedostajuće promenljive dodajte kroz -e ili u environment sekciji. Proverite i da li su fajlovi konfiguracije montirani na ispravnu putanju.

  7. 7

    Proverite dozvole i vlasništvo

    Ako aplikacija piše u volumen ili folder, uverite se da korisnik unutar kontejnera ima dozvolu. U docker run dodajte --user ili prilagodite Dockerfile. Greške sa dozvolama često se vide u logovima kao Permission denied.

  8. 8

    Isključite healthcheck i zavisnosti

    Ako koristite Compose, privremeno komentarišite healthcheck i depends_on da vidite da li kontejner samostalno radi. Zatim ih vraćajte jednu po jednu i posmatrajte ponašanje.

  9. 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.

Podeli
Niste našli rešenje?AI IT asistent je dostupan 24/7. Opišite problem ili pošaljite screenshot greške i dobićete uputstvo za vaš slučaj.Pitajte AI IT asistenta