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

替换CMD为ENTRYPOINT后Docker容器无法用Ctrl+C停止,求技术解决

解决Docker容器无法用Ctrl+C停止的问题

问题根源

你用ENTRYPOINT ["sh", "docker_init.sh"]启动容器时,sh进程是容器的PID 1进程。默认情况下sh不会将接收到的信号(比如Ctrl+C触发的SIGINT信号)转发给子进程(脚本里的python命令)。当你按Ctrl+C时,只有sh进程收到信号,但它没把信号传递给runserver进程,导致容器无法正常停止。

解决方案

方法1:在脚本中用exec启动长期运行的进程

修改docker_init.sh,对最后一个长期运行的命令(runserver)使用exec,让该命令取代sh进程成为PID 1,直接接收信号:

python manage.py migrate
python manage.py init_admin
exec python manage.py runserver 0.0.0.0:8000

exec会让后续的python进程替换当前的sh进程,成为容器的PID 1,此时Ctrl+C的信号能直接传递给它,容器即可正常停止。

方法2:在ENTRYPOINT中用exec启动脚本

修改Dockerfile的ENTRYPOINT,用exec启动脚本,确保脚本进程成为PID 1:

ENTRYPOINT ["exec", "sh", "docker_init.sh"]

这种方式下sh进程本身就是PID 1,配合脚本里的exec启动runserver,信号传递会更顺畅。

额外注意:确保脚本有执行权限

在Dockerfile中添加一行,给脚本添加可执行权限,避免因权限问题导致脚本无法运行:

RUN chmod +x docker_init.sh

将这行放在COPY ./ ./之后即可。

验证方法

修改后重新构建镜像并启动容器,按Ctrl+C时,容器应该能正常停止,无需关闭终端或重启Docker。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:47:15