You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器持续重启且无日志输出,请求排查指导

Docker容器持续重启且无日志输出排查方案

问题描述

  • profiles服务容器(profile-profiles-1)持续重启,执行docker logs profile-profiles-1无任何日志输出

环境配置

  • 采用Docker Compose管理,包含两个服务:
    • profiles:基于自定义Dockerfile构建的Python应用
    • postgres:官方PostgreSQL镜像
  • 所有服务定义在同一docker-compose.yml文件中

docker-compose.yml配置

x-variables: &variables
  ENV_STAGE: local

services:
  profiles:
    build:
      context: .
      dockerfile: ./compose/dev/web/Dockerfile
    volumes:
      - ./web/:/usr/src/web/
    ports:
      - "8000:8000"
    environment:
      <<: *variables
    env_file:
      - compose/dev/env/.env
      - compose/dev/env/.db.env
      - compose/dev/env/.data.env
    depends_on:
      - postgres
    restart: unless-stopped

  postgres:
    image: postgres:latest
    restart: always
    volumes:
      # - postgres-data:/var/lib/postgresql/data
      # - compose/dev/db/pg.conf:/etc/postgresql/postgresql.conf
      - ./compose/dev/db/pg.conf:/etc/postgresql/postgresql.conf
    environment:
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=test
      - PGDATA=/var/lib/postgresql/data
    ports:
      - 5432:5432
    # command:
    #   - config_file=/etc/postgresql/postgresql.conf
    command: postgres -c config_file=/etc/postgresql/postgresql.conf

    env_file:
      - compose/dev/env/.db.env

volumes:
  postgres-data:

Dockerfile配置

# pull official base image
FROM python:3.9-alpine

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    LANG=C.UTF-8 \
    HOME=/usr/src/web

WORKDIR $HOME

ARG GID=1000
ARG UID=1000
ARG USER=ubuntu

# install dependencies
RUN apk update \
    && apk add --no-cache curl postgresql-dev gcc python3-dev musl-dev openssl libffi-dev openssl-dev build-base \
    # install Pillow dependencies
    jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev harfbuzz-dev fribidi-dev \
    # pygraphviz
    graphviz graphviz-dev \
    && pip install --upgrade pip \
    && addgroup -g $GID -S $USER \
    && adduser -S $USER -G $USER --disabled-password --uid "$UID"

COPY ./web/config/requirements  ./requirements
RUN pip install -r ./requirements/local.txt

COPY --chown=$USER:$USER . /
COPY --chown=$USER:$USER ./web $HOME

RUN chmod +x /*.sh \
    && mkdir -p $HOME/static /redis_socket \
    && chown -R $USER:$USER $HOME/static \
    && chmod -R 777 /redis_socket \
    && flake8 .

USER $USER

已尝试排查步骤

  • 校验profiles服务的Dockerfile与Docker Compose配置正确性
  • 确认应用代码已配置向stdout/stderr写入日志
  • 排查容器健康检查未在启动阶段立即失败的情况

进一步排查建议

1. 补全容器启动命令

当前Dockerfile未定义CMD或ENTRYPOINT,容器启动后无执行命令会立即退出,触发restart: unless-stopped导致循环重启。需在Dockerfile末尾添加应用启动命令,例如:

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi:application"]

或在docker-compose.yml的profiles服务中添加command字段指定启动命令。

2. 获取容器退出状态码

执行以下命令查看容器退出状态,判断退出类型:

docker inspect profile-profiles-1 --format='{{.State.ExitCode}}'
  • 状态码0:正常退出(多为启动命令执行完成)
  • 非0:错误退出,可根据状态码对应含义排查(如127表示命令不存在,1表示通用错误)

3. 手动启动容器调试

临时修改docker-compose.yml中profiles服务的restart为no,并替换启动命令为交互式shell,直接进入容器验证环境:

services:
  profiles:
    # 保留其他配置
    restart: no
    command: sh

启动并进入容器:

docker-compose up -d profiles
docker exec -it profile-profiles-1 sh

在容器内手动执行应用启动命令,查看实时报错。

4. 确保PostgreSQL服务就绪

depends_on仅保证postgres容器启动,不保证数据库服务初始化完成。添加健康检查让profiles等待postgres就绪:

services:
  postgres:
    # 保留其他配置
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U test -d test"]
      interval: 5s
      timeout: 5s
      retries: 5
  profiles:
    # 保留其他配置
    depends_on:
      postgres:
        condition: service_healthy

5. 排查挂载卷权限问题

本地./web/挂载到容器/usr/src/web/可能存在权限不匹配(容器内ubuntu用户无读写权限)。临时移除volumes配置,启动容器测试是否正常,排除挂载问题。

6. 查看完整启动日志

执行以下命令查看Docker Compose构建和启动的完整日志:

docker-compose up --build profiles

此命令会实时输出容器启动过程中的所有日志,包括系统级启动信息。


内容的提问来源于stack exchange,提问作者FFFFFFFFF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:42:17