Python Docker容器停止后自动重启,如何彻底终止?
我有一个基于Dockerfile构建的简单Python镜像:
FROM python:3.8-slim-buster RUN apt-get -y update RUN apt-get -y install git RUN apt-get update \ && apt-get install gcc -y \ && apt-get clean WORKDIR /app COPY requirements.txt requirements.txt RUN pip install --upgrade pip RUN pip3 install -r requirements.txt ENTRYPOINT ["python"]
我曾用带restart: unless-stopped属性的docker-compose.yml运行该镜像。现在每次停止容器,它都会立即重启,表现得像设置了restart: always。哪怕改成restart: no、停止容器、重建镜像再重新执行docker run,问题还是存在。
核心问题:如何彻底终止这个容器?
更多细节
每次自动运行的命令如下(通过docker inspect --format "$(curl -s https://gist.githubusercontent.com/efrecon/8ce9c75d518b6eb863f667442d7bc679/raw/run.tpl)" <container id>获取):
docker run \ --name "/src_python_run_b28e47065e14" \ --runtime "runc" \ --volume "/home/dir/src:/app:rw" \ --log-driver "json-file" \ --restart "" \ --network "my-network_default" \ --network-alias "src_python_run_b28e47065e14" \ --network-alias "6116957bb6af" \ --hostname "6116957bb6af" \ --env "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \ --env "LANG=C.UTF-8" \ --env "PYTHON_VERSION=3.8.15" \ --env "PYTHON_PIP_VERSION=22.0.4" \ --env "PYTHON_SETUPTOOLS_VERSION=57.5.0" \ --env "PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/66030fa0332b4914d4c4d089661a0bdeeeb274/public/get-pip.py" \ --label "com.docker.compose.config-hash"="b2a7338a55582eb17895d8b5c2ee820d7c84ed2c900d7d7de0bb1fa787638d" \ --label "com.docker.compose.container-number"="1" \ --label "com.docker.compose.depends_on"="" \ --label "com.docker.compose.image"="sha256:83d2d8f4fc6374f478b982ecc217caf34c58bccf4a497d182a6e1fe35e5e04" \ --label "com.docker.compose.oneoff"="True" \ --label "com.docker.compose.project"="src" \ --label "com.docker.compose.project.config_files"="/home/dir/src/docker-compose.yml" \ --label "com.docker.compose.project.working_dir"="/home/dir/src" \ --label "com.docker.compose.service"="python" \ --label "com.docker.compose.slug"="b28e47065e14275ac786d683ffcc7cc7489e3efef144d45ab9e2ad4bf48023" \ --label "com.docker.compose.version"="2.5.0" \ --attach stdin \ --attach stdout \ --attach stderr \ --interactive \ --entrypoint "python" \ "src_python" \ "-m" "test" "run" "--file" "true"
有趣的更新
作为临时测试,我删除了docker-compose.yml和Dockerfile,确保没有容器能被重启。但奇怪的是,虽然容器已停止不再重启,但仍能在进程中看到它。执行ps aux | grep docker时,显示:
user 2963491 0.0 0.3 728792 24608 ? Rl 17:01 0:00 docker-compose run python -m test run --file true
我尝试杀死该进程,但PID不断变化,说明进程被反复停止并重启,这是为什么?
解决方案
1. 停止并清理Docker Compose关联服务
执行以下命令,针对项目名src(从容器标签获取)停止所有关联服务并清理残留:
docker-compose -p src down --remove-orphans
--remove-orphans参数会清理所有未在当前配置中定义的关联容器,避免遗漏后台守护的进程。
2. 强制删除目标容器
如果容器仍在自动重启,直接强制删除容器:
docker rm -f src_python_run_b28e47065e14
或者通过容器名前缀批量删除:
docker rm -f $(docker ps -q --filter name=src_python)
3. 排查进程反复重启的根源
docker-compose run进程反复重启,大概率是由系统级守护任务触发的,按以下步骤排查:
- 检查systemd服务:
查看是否有相关systemd单元在自动重启该任务,若有则停止并禁用:systemctl list-unit-files | grep docker systemctl status docker-compose@*systemctl stop docker-compose@xxx.service systemctl disable docker-compose@xxx.service - 检查定时任务:
查看用户或系统级定时任务中是否有自动执行该命令的配置。crontab -l ls /etc/cron.d/ cat /etc/crontab - 检查监控工具:
若使用supervisor等进程管理工具,确认是否有相关配置在维护该进程。supervisorctl status
4. 清理Docker残留资源
最后清理无用的镜像和卷,避免残留配置干扰:
docker image prune -f docker volume prune -f
内容的提问来源于stack exchange,提问作者bcsta

