Что вызывает постоянные перезапуски докер-контейнера?

Добрый день! Можете подсказать, почему контейнер с Go-приложением постоянно находится в состоянии перезапуска? 

В приведённых вами фрагментах кода Dockerfile и docker-compose.yml я заметил следующее:

- **Dockerfile**:
```dockerfile
ARG SERVER_PORT
FROM golang:1.21.7-alpine3.19 as builder
RUN apk update && apk add git
WORKDIR /project
COPY app/go.mod .
COPY app/go.sum .
RUN go mod download
COPY app/ .
RUN go build
FROM alpine:3.15
RUN apk add --no-cache tzdata
COPY --from=builder /project/ms_payments /ms_payments_app
COPY --from=builder /project/migrations /migrations
EXPOSE ${SERVER_PORT}
```
- **docker-compose.yml**:
```yaml
networks:
  ms_payments_network:
    name: ms_payments_network

services:
  ms_payments:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        SERVER_PORT: ${SERVER_PORT}
    container_name: "ms_payments"
    logging:
      driver: "json-file"
      options:
        max-size: "500m"
        max-file: "2"
    networks:
      ms_payments_network:
        aliases:
          - ms_payments
    restart: unless-stopped
    entrypoint: ["/ms_payments_app", "run"]
    ports:
      - "8080:8080"
    environment:
      SERVER_PORT: "${SERVER_PORT}"
    volumes:
      - ./storage/logs/:/logs/:rw
```

Настроенное значние переменной среды `SERVER_PORT=8080`.
  • 5 сентября 2024 г. 7:32
Ответы на вопрос 1
Постоянные перезапуски Docker-контейнера чаще всего происходят из-за того, что основной процесс внутри контейнера завершает свою работу с ошибкой или завершается по какой-либо причине. Вот несколько возможных причин, по которым ваше Go-приложение может вызывать постоянные перезапуски:

1. **Ошибка в приложении**: Если ваше Go-приложение завершает работу с ошибкой (например, паника или не обработанная ошибка), контейнер будет завершен, и Docker попытается его перезапустить. Пожалуйста, убедитесь, что ваше приложение работает корректно и обрабатывает ошибки.

2. **Неверное значение переменной среды**: Вы используете переменную среды `SERVER_PORT`. Убедитесь, что приложение правильно читает эту переменную и использует ее для своей работы. Если по какой-то причине приложение не находит или не может использовать этот порт, оно может завершиться.

3. **Проблемы с зависимостями**: Проверьте код вашего приложения на наличие ошибок, зависимостей или некорректной настройки. Возможно, в процессе инициализации оно пытается получить доступ к ресурсам, которые недоступны, что приводит к завершению приложения.

4. **Несоответствие портов**: Убедитесь, что порт, на котором слушает ваше приложение, соответствует порту, указному в разделе `ports` вашего `docker-compose.yml`. Например, если ваше приложение слушает на порту 8080 (что вы указали), убедитесь, что код действительно настраивает сервер на этот порт.

5. **Логи**: Проверьте логи контейнера для получения более детальной информации о причине завершения работы приложения. Вы можете сделать это с помощью команды:
   ```bash
   docker logs ms_payments
   ```
   Это может дать подсказки о том, что именно идет не так.

6. **Условие выхода**: Убедитесь, что ваш программный код не выходит с ненулевым статусом. Docker рассматривает любую ненулевую завершение как ошибку и перезапускает контейнер.

Если после проверки всех вышеуказанных пунктов проблема все еще сохраняется, возможно, вам следует предоставить больше информации о логах контейнера или коде вашего Go-приложения для дальнейшей диагностики.
Похожие вопросы