Контейнер сразу выходит с кодом 0 — определите проблему запуска.
Контейнер сервиса стартует и тут же останавливается. docker ps -a показывает Exited (0) через секунды после запуска, а docker logs печатает один баннер сборки и больше ничего. Ниже Dockerfile и наблюдаемое состояние.
FROM python:3.12-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "manage.py", "migrate"]
$ docker ps -a
CONTAINER ID IMAGE COMMAND STATUS
a1b2c3d4e5f6 svc "python manage.py mig…" Exited (0) 3 seconds ago
$ docker logs a1b2c3d4e5f6
Operations to perform: ... OK
Объясните, почему он выходит, и что изменить, чтобы контейнер продолжал работать.
Код выхода 0 значит, что главный процесс успешно завершился — он не упал. CMD запускает разовую миграцию, которая отрабатывает и возвращается, а контейнер живёт лишь пока жив его PID 1. Сделайте PID 1 долгоживущим сервером, а миграцию вынесите отдельным init-шагом.
- ✗Читать выход 0 как падение, а не как чистое завершение главного процесса
- ✗Делать PID 1 разовой командой вместо долгоживущего сервера
- ✗Держать контейнер живым через sleep вместо запуска самого сервиса как CMD
- →Как код выхода 127 вместо 0 изменил бы вашу диагностику?
- →Где запускать миграцию в Kubernetes-деплое — init-контейнер или Job?
Контейнер живёт ровно столько, сколько живёт его процесс PID 1. Здесь PID 1 — это python manage.py migrate: разовая команда, которая успешно отрабатывает и возвращает 0. Поэтому контейнер штатно останавливается — это не падение.
Сделайте главной командой долгоживущий сервер, а миграцию вынесите отдельным шагом (init-контейнер, Job или запуск перед стартом), а не в CMD сервиса.
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
# PID 1 — долгоживущий сервер, а не разовая миграция.
CMD ["gunicorn", "app.wsgi", "--bind", "0.0.0.0:8000"]