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
相关产品推荐
相关产品推荐

