Docker容器运行Python脚本无法接收终端交互输入问题
问题解决方案
你遇到的问题由3个配置错误导致,按以下步骤修改即可解决:
1. 修正run.sh启动脚本
原脚本存在shebang路径错误、timeout交互参数缺失、Python缓冲未关闭三个问题,修改后的内容如下:
#!/usr/bin/env bash timeout --foreground --signal=SIGTERM 500 python3 -u main.py exit $?
参数说明:
--foreground:让timeout命令将前台终端的交互信号、输入直接转发给Python子进程,不加该参数时timeout会将子进程放到后台运行,终端输入无法传递到脚本-u:强制Python进程关闭标准输入输出的全缓冲,实时处理终端输入输出,避免内容滞留在缓冲区不被读取- 补全shebang的根路径前缀
/,避免部分操作系统环境下脚本执行异常
2. 可选优化(推荐)
可以在Dockerfile中添加环境变量永久关闭Python全缓冲,无需每次执行脚本时加-u参数,修改后的Dockerfile如下:
FROM python:3 WORKDIR /app USER root ENV PYTHONUNBUFFERED=1 ADD . . RUN chmod a+x ./main.py RUN chmod a+x ./run.sh ENTRYPOINT ["sh","./run.sh"]
3. 重新构建运行
你原来的docker运行命令已经添加了-ti分配交互终端的参数,无需修改,直接重新构建运行即可:
docker image build . -t testimg --rm docker run -ti --name testimg testimg
运行后输入内容按回车,即可正常触发脚本的打印逻辑,500秒超时时间到后进程会自动终止。
内容的提问来源于stack exchange,提问作者xineta5158
相关产品推荐
相关产品推荐

