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

