关于WSL的代理问题一则
目录
今天在使用wsl的docker build
拉取镜像时,报错:
ERROR: failed to solve: alpine: failed to resolve source metadata for docker.io/library/alpine:latest: failed to do request: Head "https://registry-1.docker.io/v2/library/alpine/manifests/latest": proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused
即使关闭了代理,仍然报这个错误。于是各种检查,到底是在哪设置的代理。
首先检查环境变量:
echo $http_proxy
echo $https_proxy
确认没有设置环境变量。
然后检查配置文件:
sudo cat /etc/docker/daemon.json
因为使用的是Docker Desktop for Windows
,所以并没有这个文件,也没有配置代理。
检查 WinHTTP 代理设置,也没有设置。
PS C:\Users\admin> netsh winhttp show proxy
当前的 WinHTTP 代理服务器设置:
直接访问(没有代理服务器)。
尝试禁用BuildKit
,依然报错:
export DOCKER_BUILDKIT=0
docker build .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0
environment-variable.
Sending build context to Docker daemon 4.316MB
Step 1/29 : FROM node:20.19.1-bookworm AS front
Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused
检查/etc/resolv.conf
,一切正常:
cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 10.255.255.254
检查%USERPROFILE%\.wslconfig
,终于找到了问题:
cat ~/.wslconfig
[experimental]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
这是之前将wsl的网络模式由NAT改为镜像模式,顺手复制粘贴的配置。其中autoProxy=true
表示 WSL 会自动继承 Windows 的代理设置。在windows运行的clash会在127.0.0.1:7890 启动本地 HTTP 代理服务。WSL 检测到这个代理后,就会把所有网络请求都转发到这个地址,即使代理没运行,它也会尝试连接。这就是为什么在windows关了代理仍在wsl仍会尝试连接7890端口。将其修改未false后问题解决。
虽然docker默认使用代理的问题解决了,但docker build
不可以的问题依然存在。一下是一些可供参考的内容。
Help on “ERROR [internal] load metadata for docker.io/library/node:18-alpine” https://stackoverflow.com/questions/73812700/docker-error-internal-load-metadata-for-docker-io can’t docker pull images from China
可行的解决方案大概有
docker logout
docker login
重新登录docker pull
手动拉取镜像export DOCKER_BUILDKIT=0
禁用buildkit- 设置镜像站等