Windows10下Docker构建Django镜像时pip安装连接失败求助
Docker构建Django镜像时pip安装依赖失败(DNS解析错误)
问题描述
在Windows 10系统下,通过CMD执行Docker构建Django项目镜像时,pip安装requirements.txt依赖包失败,报错核心为DNS解析失败(Temporary failure in name resolution),无法连接到PyPI服务器。
我的Dockerfile内容:
FROM python:3.8-slim-buster WORKDIR /main COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD python manage.py runserver
构建命令及报错日志:
E:\Satya_Django_TODO_APP\todo>docker build -t my_image --rm . [+] Building 95.5s (8/9) => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 32B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/python:3.8-slim-buster 2.2s => [1/5] FROM docker.io/library/python:3.8-slim-buster@sha256:0b92aced9b0e52b16870a7c09 0.0s => [internal] load build context 0.1s => => transferring context: 28.89kB 0.0s => CACHED [2/5] WORKDIR /main 0.0s => CACHED [3/5] COPY requirements.txt requirements.txt 0.0s => ERROR [4/5] RUN pip3 install -r requirements.txt 93.0s ------ > [4/5] RUN pip3 install -r requirements.txt: #8 13.02 WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f04029205e0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /simple/aioredis/ #8 15.23 Collecting aioredis==1.3.1 #8 25.24 WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f0402d7c4c0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /packages/b0/64/1b1612d0a104f21f80eb4c6e1b6075f2e6aba8e228f46f229cfd3fdac859/aioredis-1.3.1-py3-none-any.whl #8 35.75 WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f0402d7c730>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /packages/b0/64/1b1612d0a104f21f80eb4c6e1b6075f2e6aba8e228f46f229cfd3fdac859/aioredis-1.3.1-py3-none-any.whl #8 46.77 WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f0402d7c910>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /packages/b0/64/1b1612d0a104f21f80eb4c6e1b6075f2e6aba8e228f46f229cfd3fdac859/aioredis-1.3.1-py3-none-any.whl #8 58.78 WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f0402d7cb20>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /packages/b0/64/1b1612d0a104f21f80eb4c6e1b6075f2e6aba8e228f46f229cfd3fdac859/aioredis-1.3.1-py3-none-any.whl #8 72.80 WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f0402d7cca0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /packages/b0/64/1b1612d0a104f21f80eb4c6e1b6075f2e6aba8e228f46f229cfd3fdac859/aioredis-1.3.1-py3-none-any.whl #8 82.81 ERROR: Could not install packages due to an OSError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Max retries exceeded with url: /packages/b0/64/1b1612d0a104f21f80eb4c6e1b6075f2e6aba8e228f46f229cfd3fdac859/aioredis-1.3.1-py3-none-any.whl (Caused by NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f0402d7ce50>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')) #8 82.81 ------ executor failed running [/bin/sh -c pip3 install -r requirements.txt]: exit code: 1
原因分析
该错误是Docker构建阶段,容器内部无法解析外部域名导致的,常见诱因包括:
- Docker DNS配置异常,无法获取正确的域名解析服务器
- Windows防火墙/第三方安全软件拦截了Docker的网络请求
- WSL2后端网络配置冲突(若使用WSL2作为Docker后端)
- 代理设置干扰DNS解析
解决方案
1. 手动指定Docker DNS服务器
打开Docker Desktop,依次进入Settings > Resources > Network,在DNS服务器栏手动填写8.8.8.8(谷歌公共DNS)或114.114.114.114(国内公共DNS),取消"自动获取"选项,点击Apply & Restart重启Docker后重新构建。
2. 排查防火墙干扰
- 临时关闭Windows Defender防火墙,执行构建命令测试是否正常
- 若关闭后恢复正常,给Docker Desktop添加防火墙入站/出站规则,允许其访问网络
- 检查是否有第三方防火墙软件(如360、火绒),暂时禁用后测试
3. 修复WSL2网络配置(若使用WSL2后端)
- 打开CMD执行以下命令重启WSL:
wsl --shutdown - 重启Docker Desktop,再尝试构建
- 若问题持续,创建WSL配置文件固定DNS:
- 进入WSL终端,创建
/etc/wsl.conf文件:sudo nano /etc/wsl.conf - 写入以下内容:
[network] generateResolvConf = false - 保存退出后,执行
wsl --shutdown重启WSL - 再次进入WSL终端,编辑
/etc/resolv.conf:sudo nano /etc/resolv.conf - 添加
nameserver 8.8.8.8,保存退出
- 进入WSL终端,创建
4. 更换PyPI镜像源
修改Dockerfile中的pip安装命令,指定国内高速镜像源,直接绕过DNS解析问题同时加速安装:
方法1:临时指定镜像
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
方法2:全局配置镜像
FROM python:3.8-slim-buster WORKDIR /main # 配置pip全局镜像源 RUN echo "[global]" > /etc/pip.conf \ && echo "index-url = https://pypi.tuna.tsinghua.edu.cn/simple" >> /etc/pip.conf COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD python manage.py runserver
5. 检查代理设置
- 若Windows开启了代理,进入Docker Desktop
Settings > Resources > Proxies,选择"Use the same proxy as Windows",或手动填写正确的代理地址 - 若代理配置复杂,可尝试临时关闭代理后执行构建命令
内容的提问来源于stack exchange,提问作者Satya Rai
相关产品推荐
相关产品推荐

