如何在Docker Windows容器中成功安装requirements.txt(Python模块)
Windows Docker容器安装requirements.txt踩坑解决思路
问题背景
在公司内网环境里,用Windows Docker容器装requirements.txt时碰到俩问题:
- 容器配置JSON里加
dns字段,直接报网络相关错误; - 删掉
dns字段,又出现依赖安装失败的报错; - 同样的requirements.txt在Linux容器里装完全没问题,但因为必须用到只支持Windows的
pywin32库,只能死磕Windows容器; - 翻了一堆博客和StackOverflow帖子,没找到能直接解决的方案。
逐个问题拆解解决
1. 带dns字段的网络报错
公司内网基本都有自己的DNS服务器,Windows容器的DNS配置很容易和内网环境不兼容:
- 别用8.8.8.8这种公共DNS,直接把容器DNS改成公司内网的DNS地址;
- 检查Docker daemon的
daemon.json配置,给全局加上内网DNS,让Windows容器自动继承:{ "dns": ["192.168.x.x"] // 换成你们公司内网DNS的实际地址 } - 改完记得重启Docker服务,再重新构建容器,不然DNS配置不生效,连依赖包的地址都解析不了。
2. 不带dns字段的安装报错
这种情况十有八九是pip源或者代理的问题:
- 内网环境下默认的PyPI源肯定访问不了,直接在requirements.txt最开头加上公司内部的PyPI镜像配置:
或者在Dockerfile里提前给pip配置好源:--index-url http://公司PyPI镜像地址/simple/ --trusted-host 公司PyPI镜像域名RUN pip config set global.index-url http://公司PyPI镜像地址/simple/ RUN pip config set global.trusted-host 公司PyPI镜像域名 - 如果公司需要走代理才能访问外网PyPI,就在Dockerfile里加代理环境变量:
ENV HTTP_PROXY=http://公司代理地址:端口 ENV HTTPS_PROXY=http://公司代理地址:端口 ENV NO_PROXY=公司内部域名列表 - 另外检查下
pywin32的版本,得和Windows容器的系统版本匹配,比如用Windows Server 2019容器的话,pywin32至少要227以上版本,版本不兼容也会装失败。
3. 额外验证步骤
- 进到运行的Windows容器里,手动跑
nslookup 公司PyPI地址,看看DNS解析正常不; - 单独装
pywin32试试:pip install pywin32,排除其他依赖的干扰; - 要是还是不行,找公司运维确认下容器有没有访问PyPI源的权限,内网防火墙说不定拦了。
内容的提问来源于stack exchange,提问作者Manish Shegokar
相关产品推荐
相关产品推荐

