docker build --build-arg PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ -t api:2.1 . RUN pip install --no-cache-dir --timeout 30 --retries 5 -r requirements.txt
构建日志停在 Collecting pandas 之后不动,七分钟报 ReadTimeoutError: HTTPSConnectionPool(host='pypi.org', port=443)。同一台机器上 pip 直接装是通的。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,构建阶段默认走公网源,容器网络的出口和宿主机不是一条链路,DNS 和 TLS 都要重新来一遍。构建缓存没命中时每次都要重新下载几十个包,超时点很容易踩到。
这次卡住的地方就在「pip 源构建超时」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:把 index-url 写进构建参数 指向内网镜像源;在 Dockerfile 里显式加 --timeout 和 --retries 别用默认值;依赖清单锁定版本 避免构建时反复解析;用 BuildKit 的 cache mount 缓存 pip 目录 减少重复下载。
改完只确认一件事:构建时间从七分钟降到一分多,日志里的下载地址变成内网域名。
