如何修改Dockerfile以同时运行Flask服务与定时请求脚本?
解决Docker同时运行Flask服务和定时请求脚本的问题
原Dockerfile存在两个核心问题:
- 多个
CMD指令仅最后一个会生效,因此metricRequester.py &完全没被执行 - 使用
ENTRYPOINT ["python3"]这种exec格式时,CMD里的&不会被shell解析,无法实现后台运行脚本
方法一:使用启动脚本统一管理进程
- 在项目根目录创建
start.sh启动脚本:
#!/bin/bash # 后台运行定时请求脚本 python3 metricRequester.py & # 前台启动Flask服务(保持容器运行) python3 app.py
- 本地给脚本添加执行权限:
chmod +x start.sh
- 改写Dockerfile:
FROM ubuntu:18.04 RUN apt-get update -y && apt-get install -y python3 python3-pip COPY ./requirement.txt /app/requirement.txt WORKDIR /app RUN pip3 install -r requirement.txt COPY ./src /app # 复制启动脚本并赋予执行权限 COPY start.sh /app/start.sh RUN chmod +x /app/start.sh EXPOSE 8022 # 以启动脚本作为容器入口 ENTRYPOINT ["/app/start.sh"]
方法二:直接在Dockerfile中用Shell命令启动
无需额外脚本,直接通过Shell命令同时启动两个进程:
FROM ubuntu:18.04 RUN apt-get update -y && apt-get install -y python3 python3-pip COPY ./requirement.txt /app/requirement.txt WORKDIR /app RUN pip3 install -r requirement.txt COPY ./src /app EXPOSE 8022 # 用Shell执行命令,后台运行定时脚本,前台运行Flask服务 ENTRYPOINT ["bash", "-c"] CMD ["python3 metricRequester.py & python3 app.py"]
额外注意事项
- 确保
metricRequester.py中的请求地址http://127.0.0.1:8022/正确,同一容器内的进程可通过127.0.0.1互相访问 - Flask服务需监听
0.0.0.0才能被容器外部访问(容器内访问不受影响),若app.py未配置,需补充:
if __name__ == '__main__': app.run(host='0.0.0.0', port=8022)
内容的提问来源于stack exchange,提问作者HurlyBurly
相关产品推荐
相关产品推荐

