Ubuntu 16.04下Docker-ce构建应用时Flask安装失败求助
解决Docker构建时企业代理下pip安装依赖失败的问题
我之前在企业代理环境下用Docker构建Python应用时,也碰到过完全一样的pip安装Flask/Redis失败的问题,折腾了好一阵才搞定,给你几个实用的排查和解决步骤:
先设置全局代理环境变量,而非仅在pip命令中指定
很多时候仅在pip install后加--proxy参数不够稳定,尤其是旧版本的pip。建议在Dockerfile里先添加全局代理环境变量,让容器内所有网络请求都走代理:ENV http_proxy=http://10.70.52.146:3128 ENV https_proxy=http://10.70.52.146:3128 ENV no_proxy=localhost,127.0.0.1这样后续的pip、curl等工具都会自动使用代理,避免单独配置的遗漏。
升级pip到最新版本
Ubuntu 16.04对应的Python镜像里的pip版本通常比较老旧,对HTTPS代理和新的PyPI域名支持不佳。先升级pip再安装依赖能解决很多兼容性问题:RUN pip install --upgrade pip --proxy ${http_proxy} --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org RUN pip install -r requirements.txt --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org这里多加几个
--trusted-host是因为现在PyPI的包分发域名不止pypi.python.org,旧版pip如果只信任这个域名,会导致从其他合法域名拉取包时失败。验证容器内代理的连通性
先确认容器能不能正常访问代理服务器,在Dockerfile里加一个测试命令:RUN curl -v https://pypi.org --proxy ${http_proxy}如果curl失败,那问题大概率不在pip,而是以下几种情况:
- 代理服务器的IP/端口写错了?仔细核对一下企业给出的代理配置
- 企业防火墙限制了容器访问代理端口?需要联系运维确认容器所在网络能否访问代理地址
- 代理需要用户名密码认证?如果是这种情况,代理地址要写成
http://username:password@10.70.52.146:3128(注意如果密码有特殊字符需要URL编码)
规范requirements.txt的格式
虽然pip支持空格分隔包名,但旧版本的pip可能会解析出错,建议把每个包单独写一行:Flask Redis
完整修改后的Dockerfile示例
# 使用适配Ubuntu 16.04的Python基础镜像 FROM python:3.5 # 设置全局代理环境变量 ENV http_proxy=http://10.70.52.146:3128 ENV https_proxy=http://10.70.52.146:3128 ENV no_proxy=localhost,127.0.0.1 # 升级pip到稳定版本 RUN pip install --upgrade pip --proxy ${http_proxy} --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org # 复制依赖清单到容器内 COPY requirements.txt /app/requirements.txt WORKDIR /app # 安装项目依赖 RUN pip install -r requirements.txt --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org # 后续的应用构建步骤(比如复制代码、启动命令等) # COPY . /app # CMD ["python", "app.py"]
内容的提问来源于stack exchange,提问作者Utkarsh Sahai
相关产品推荐
相关产品推荐

