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

无法停止Docker容器:Permission Denied错误排查求助

问题分析与解决方案

核心原因

  1. PID 1进程信号处理缺陷:容器直接以python作为PID 1进程,Python对Linux信号的处理存在局限性,非root用户运行时无法正确响应docker stop发送的SIGTERM信号,导致Docker daemon后续尝试发送SIGKILL时触发权限限制。
  2. AppArmor profile限制:Ubuntu 22.04默认的Docker AppArmor profile(docker-default)可能阻止了daemon向非root用户运行的容器进程发送终止信号,即使root用户操作也会被拦截。

解决方案

方案1:使用tini作为进程初始化工具(推荐)

tini是轻量级init进程,能正确处理Linux信号并转发给子进程,解决PID 1的信号处理问题,同时兼容非root用户运行。

修改你的Dockerfile:

FROM python:3.10.9-alpine3.16
RUN adduser -D app
# 安装静态编译的tini(Alpine仓库中的tini-static)
RUN apk add --no-cache tini-static
USER app
WORKDIR /usr/src/app

COPY . .
RUN pip install --no-cache-dir -r requirement.txt

# 将tini设为ENTRYPOINT,负责启动并管理python进程
ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "python", "./main.py" ]

重新构建并运行容器:

docker build -t mytag/fastapi_web_app:latest .
docker run -p 8080:8080 mytag/fastapi_web_app:latest

方案2:优化FastAPI应用的信号处理

确保Python应用能正确响应SIGTERM信号,避免Docker daemon触发强制终止流程。修改main.py:

import signal
import sys
from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

def shutdown_handler(signum, frame):
    print("接收到终止信号,正在退出...")
    sys.exit(0)

if __name__ == "__main__":
    # 注册SIGTERM信号处理函数
    signal.signal(signal.SIGTERM, shutdown_handler)
    uvicorn.run(app, host="0.0.0.0", port=8080)

方案3:自定义AppArmor Profile(针对权限限制)

如果上述方案无效,可创建自定义AppArmor profile,允许Docker daemon向容器进程发送终止信号:

  1. 创建/etc/apparmor.d/docker-custom文件,内容如下:
#include <tunables/global>

profile docker-custom flags=(attach_disconnected,mediate_deleted) {
    # 继承默认Docker profile的所有规则
    #include <abstractions/docker>

    # 允许发送TERM和KILL信号到容器进程
    signal (send) set=(term kill) peer=docker-default,
}
  1. 加载新的profile:
sudo apparmor_parser -r /etc/apparmor.d/docker-custom
  1. 运行容器时指定使用该profile:
docker run -p 8080:8080 --security-opt apparmor=docker-custom mytag/fastapi_web_app:latest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:57:57