Прескочи на садржај
EVI Solutions

Docker контејнер се одмах гаси: како пронаћи узрок и поправити

Средње 15 мин Ažurirano:

Кратак одговор

Када се Docker контејнер одмах угаси, прво проверите `docker logs` и exit код. Најчешћи узроци су погрешна стартна команда, апликација која заврши одмах, недостајућа конфигурација или дозвола, и контејнер који нема шта да ради у првом плану. Исправите команду или entrypoint и покрените контејнер интерактивно да видите грешку.

Како се проблем препознаје

  • `docker ps` не приказује контејнер, а `docker ps -a` га води као Exited
  • Контејнер се покрене па нестане у року од неколико секунди
  • У логовима нема ничега или само порука о грешци при старту
  • Апликација ради локално, али у контејнеру одмах изађе
  • Exit код је 0, 1, 127 или 137

Најчешћи узроци

Погрешна стартна команда или entrypoint

Ако је у Доцкерфиле-у или `docker run` команди наведена непостојећа команда, контејнер излази са кодом 127. Проверите да ли је путања до извршног фајла исправна и да ли је команда у формату који Docker очекује.

Апликација заврши одмах

Контејнер живи док год главни процес ради. Ако апликација само одради нешто и заврши, или ако је покренута у позадини, контејнер ће се угасити. Потребно је да главни процес остане у првом плану.

Недостаје конфигурација или дозвола

Апликација може пасти ако нема променљиве окружења, фајл конфигурације или дозволу за упис. У логовима се тада види грешка при старту, на пример да база није доступна или да фајл не постоји.

Порт или ресурси

Ако је порт заузет, покретање може да не успе уз поруку да је порт већ заузет. Контејнер може да изађе и ако нема довољно меморије или ако је процес убијен због ограничења.

Зависност између сервиса

У Docker Цомпосе окружењу контејнер може да не стартује или да изађе ако сервис од ког зависи није спреман. Проверите редослед и услове у `depends_on`, а хеалтхцхецк користите да проверите да ли је зависни сервис заиста спреман.

Решење корак по корак

  1. 1

    Проверите статус и exit код

    Покрените docker ps -a да видите све контејнере, укључујући угашене. Обратите пажњу на колону STATUS и на exit код. Код 0 значи да је процес завршио нормално, 1 је општа грешка, 127 непостојећа команда, а 137 указује на присилно заустављање, често због меморије.

  2. 2

    Прегледајте логове

    Покрените docker logs <ime_ili_id>. Ако је контејнер угашен, додајте --tail 100 да видите последњих сто линија. Логови најчешће садрже тачан разлог, на пример грешку у конфигурацији или поруку да команда није пронађена.

  3. 3

    Покрените контејнер интерактивно

    Заобилазите стартну команду и уђите у љуску: docker run -it --entrypoint /bin/sh <slika>. Ако слика нема sh, пробајте bash. Унутар контејнера ручно покрените апликацију и видите грешку коју иначе не видите.

  4. 4

    Проверите команду и entrypoint

    Погледајте Доцкерфиле и docker run команду. Уверите се да је CMD или ENTRYPOINT у исправном формату и да путања до извршног фајла постоји. Ако користите docker compose, проверите поље command у docker-compose.yml.

  5. 5

    Уверите се да главни процес остаје у првом плану

    Апликација не сме да се покреће у позадини нити да заврши одмах. Ако је у питању скрипта, додајте на крај петљу или покрените server који слуша. За контејнере који само треба да остану активни, користите tail -f /dev/null као привремено решење.

  6. 6

    Проверите променљиве окружења и конфигурацију

    Упоредите docker inspect <kontejner> са оним што апликација очекује. Недостајуће променљиве додајте кроз -e или у environment секцији. Проверите и да ли су фајлови конфигурације монтирани на исправну путању.

  7. 7

    Проверите дозволе и власништво

    Ако апликација пише у волумен или фолдер, уверите се да корисник унутар контејнера има дозволу. У docker run додајте --user или прилагодите Доцкерфиле. Грешке са дозволама често се виде у логовима као Permission denied.

  8. 8

    Искључите хеалтхцхецк и зависности

    Ако користите Цомпосе, привремено коментаришите healthcheck и depends_on да видите да ли контејнер самостално ради. Затим их враћајте једну по једну и посматрајте понашање.

  9. 9

    Поново изградите слику

    Ако сте мењали Доцкерфиле, покрените docker build --no-cache -t <ime> . па поново покрените контејнер. Кеширани слој може да сакрије измену која је узрок проблема.

Ако ништа не помогне

Укључите детаљније логовање апликације и покрените је са docker run без -d да видите излаз уживо. Проверите да ли се контејнер гаси због OOMKilled у docker inspect (поље State.OOMKilled). Ако користите Kubernetes или други оркестратор, погледајте догађаје и рестарт цоунт. Када је проблем у самој апликацији, покрените је ван контејнера са истим променљивама окружења да изолујете Docker. За сложене случајеве са више сервиса, корисно је направити минимални docker-compose.yml са само једним сервисом и постепено додавати остале.

Како да спречите да се понови

  • Увек користите `docker logs` и exit код пре него што мењате било шта.
  • У Доцкерфиле-у експлицитно наведите `CMD` или `ENTRYPOINT` и тестирајте га локално.
  • Повремено чистите заустављене контејнере, неискоришћене мреже и данглинг слике командом `docker system prune`; пре покретања проверите шта ће бити уклоњено и направите резервну копију важних података.
  • У Цомпосе фајлу дефинишите хеалтхцхецк и `restart: unless-stopped` за сервисе који треба да раде стално.

Када је боље позвати стручњака

Ако сте испробали све кораке, а контејнер и даље излази без јасног разлога, или ако проблем укључује више сервиса и продукцијско окружење, обратите се IT подршци да заједно анализирате конфигурацију и логове.

Развој софтвера и производа · Апликације по мери, SaaS и MVP за 4 до 8 недеља

Честа питања

Зашто се контејнер гаси са exit кодом 0?

Exit код 0 значи да је главни процес завршио успешно, али то значи и да контејнер нема више шта да ради. Најчешће је апликација покренута у позадини или је завршила одмах. Решење је да главни процес остане у првом плану.

Како да видим грешку која се не појављује у логовима?

Покрените контејнер интерактивно са `docker run -it --entrypoint /bin/sh <slika>` и ручно покрените апликацију. Тако ћете видети излаз уживо. Можете и привремено покренути контејнер са `sleep 3600` као командом, уз `--entrypoint` ако је потребно, па ући у њега и тестирати.

Шта значи exit код 137?

Код 137 обично значи да је процес насилно прекинут, најчешће због недостатка меморије (OOM). Проверите `docker inspect` и поље `State.OOMKilled`. Повећајте меморију или оптимизујте апликацију.

Подели
Нисте нашли решење?AI IT асистент је доступан 24/7. Опишите проблем или пошаљите screenshot грешке и добићете упутство за ваш случај.Питајте AI IT асистента