Когда Docker контейнер вылетает прямо после запуска, это всегда выглядит странно. Особенно если локально всё работало нормально. Давайте разберёмся, что чаще всего заставляет контейнер выходить с ошибкой.
Первое правило: смотрите логи
Контейнер существует ровно столько, сколько выполняется процесс внутри него. Если процесс завершился или вообще не запустился, контейнер упадёт. Это закономерно, но информация об ошибке может быть скрыта.
docker logs
Запустите эту команду сразу, как только контейнер упал. Часто там будет сразу видно, что случилось. Если логов мало, добавьте флаг
--tail 100 или посмотрите всё целиком через --all.Рабочая директория и файлы
Очень частая причина. Если приложение ищет конфиг в
/app/config, а в образе это лежит в /etc/app, всё сломается.Проверьте в Dockerfile:
WORKDIR /app
COPY . .
Убедитесь, что все нужные файлы скопированы на место и структура директорий совпадает с тем, что ожидает приложение.
Переменные окружения
Приложение может требовать
DATABASE_URL или API_KEY, и если их нет, оно не запустится. При запуске передавайте всё нужное:docker run -e DATABASE_URL=postgres://... -e API_KEY=secret myapp:latest
Или через файл:
docker run --env-file .env myapp:latest
Проверьте документацию вашего приложения на список обязательных переменных.
Runtime и зависимости
Иногда базовый образ не содержит то, что нужно. Вы собрали Go приложение, положили бинарник в контейнер на основе
alpine:latest, но забыли нужную библиотеку. Результат предсказуем.FROM golang:1.21 as builder
WORKDIR /build
COPY . .
RUN go build -o app .
FROM alpine:latest
RUN apk add --no-cache ca-certificates
COPY --from=builder /build/app /usr/local/bin/
Убедитесь, что в образе есть всё необходимое. Используйте
docker run -it myimage sh и проверьте вручную, работает ли приложение.Порты и привилегии
Контейнер может падать из-за проблем с портами или правами. Если приложение пытается слушать на порту ниже 1024, но не запущено от root, это не сработает.
USER appuser
EXPOSE 8080
Убедитесь, что пользователь имеет нужные привилегии и приложение слушает на доступном порту.
Точка входа
Проверьте, правильная ли у вас ENTRYPOINT или CMD:
ENTRYPOINT ["node", "server.js"]
Если здесь опечатка или путь неверный, контейнер не запустится. Команда должна существовать и быть исполняемой.
Быстрая диагностика
Запустите контейнер интерактивно с sh вместо основного процесса:
docker run -it myapp:latest /bin/sh
Теперь вы внутри контейнера. Проверьте рабочую директорию, переменные окружения, наличие файлов. Попробуйте запустить приложение вручную и посмотрите, что сломается.
Что проверить в первую очередь
1. Логи контейнера через
docker logs2. Переменные окружения и их значения
3. Рабочая директория и наличие файлов
4. Запуск приложения вручную внутри контейнера через
/bin/sh5. Права доступа и привилегии пользователя
Если контейнер падает, проблема почти всегда в одном из этих пунктов. Диагностика займёт несколько минут, если знать, где искать.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженера