Tian Jiale's Blog

wsl 中构建 Golang 项目时网络代理引起构建卡壳的问题

问题背景和描述

Windows 系统中使用 Clash-for-Windows 作为代理应用,同时 wsl 中设置了系统代理,配置如下:

export http_proxy="http://192.168.1.3:7890/"
export https_proxy="http://192.168.1.3:7890/"
export ftp_proxy="http://192.168.1.3:7890/"
export no_proxy="127.0.0.1,localhost"

export HTTP_PROXY="http://192.168.1.3:7890/"
export HTTPS_PROXY="http://192.168.1.3:7890/"
export FTP_PROXY="http://192.168.1.3:7890/"
export NO_PROXY="127.0.0.1,localhost"

我的目标是构建 Golang 应用,涉及到的 Dockerfile 如下:

FROM golang:1.18.4 AS BACK
WORKDIR /go/src/bus
COPY . .
RUN ./build.sh

其中 build.sh 内容如下:

#!/bin/bash
#try to connect to google to determine whether user need to use proxy
curl www.google.com -o /dev/null --connect-timeout 5 2 > /dev/null
if [ $? == 0 ]
then
    echo "Successfully connected to Google, no need to use Go proxy"
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o server .
else
    echo "Google is blocked, Go proxy is enabled: GOPROXY=https://goproxy.cn,direct"
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOPROXY=https://goproxy.cn,direct go build -ldflags="-w -s" -o server .
fi

此时正常构建会卡到如下步骤:

[2/3] STEP 4/4: RUN ./build.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15157    0 15157    0     0    504      0 --:--:--  0:00:30 --:--:--     0

这一步几个小时都不会有好转。

解决方法

问题背景和问题描述都清楚之后,怎么解决呢?尝试过如下方法:

  1. 等待更长时间,但三个小时都不起效果。
  2. 更换 Podman,经测试同样如此。

这就很迷惑了,猜测可能是网络问题,所以经过不断尝试发现如下解决方案。

  1. 暂时将 Clash-for-WindowsAllow LAN 关闭;

  2. 执行构建命令;

  3. 等待出现如下日志:

    [2/3] STEP 4/4: RUN ./build.sh
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0
    curl: (28) Connection timed out after 5001 milliseconds
    
  4. 打开 Clash-for-WindowsAllow LAN

然后就可以正常下载项目依赖并构建了。至于为什么会出现这种状况,还需要再了解下 Docker 网络相关的内容了。