WSL环境下Docker build未应用代理设置的问题求助
问题描述
在Windows通过WSL(Ubuntu环境)使用Docker时,docker build过程中Dockerfile内的apt命令无法使用代理,而WSL内的apt和docker pull均可正常走代理。此前直接使用Docker Desktop时,代理设置对docker run和docker build均能正常生效。
已配置的代理位置:
- 在
/etc/environment中设置环境变量:
http_proxy=http://username:password@proxy.com:3128 https_proxy=http://username:password@proxy.com:3128
- 在
/etc/docker/daemon.json中配置代理:
{ "proxies": { "http-proxy": "http://username:password@proxy.com:3128", "https-proxy": "http://username:password@proxy.com:3128", "no-proxy": "localhost,127.0.0.1,docker-registry.somecorporation.com" }, "insecure-registries": ["mcr.microsoft.com"] }
- 在
/etc/systemd/system/docker.service.d/proxy.conf中添加代理:
[Service] Environment="http_proxy=http://username:password@proxy.com:3128" Environment="https_proxy=http://username:password@proxy.com:3128" Environment="no_proxy=localhost,127.0.0.1,docker-registry.somecorporation.com"
Dockerfile内容
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 RUN apt-get update && \ apt-get install -y libldap2-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["EQP_Workspace/EQP_Workspace.csproj", "EQP_Workspace/"] RUN dotnet restore "EQP_Workspace/EQP_Workspace.csproj" COPY . . WORKDIR "/src/EQP_Workspace" RUN dotnet build "EQP_Workspace.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "EQP_Workspace.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "EQP_Workspace.dll"]
错误信息
[eqp_workspace base 3/3] RUN apt-get update && apt-get install -y libldap2-dev && apt-get clean && rm -rf /var/lib/apt/lists/*: 30.69 Ign:1 http://deb.debian.org/debian bookworm InRelease 30.70 Ign:2 http://deb.debian.org/debian bookworm-updates InRelease 30.70 Ign:3 http://deb.debian.org/debian-security bookworm-security InRelease 31.70 Ign:1 http://deb.debian.org/debian bookworm InRelease 31.70 Ign:2 http://deb.debian.org/debian bookworm-updates InRelease 31.71 Ign:3 http://deb.debian.org/debian-security bookworm-security InRelease 33.70 Ign:1 http://deb.debian.org/debian bookworm InRelease 33.71 Ign:2 http://deb.debian.org/debian bookworm-updates InRelease 33.71 Ign:3 http://deb.debian.org/debian-security bookworm-security InRelease 37.70 Err:1 http://deb.debian.org/debian bookworm InRelease 37.70 Could not connect to deb.debian.org:80 (199.232.46.132), connection timed out 37.71 Err:2 http://deb.debian.org/debian bookworm-updates InRelease 37.71 Unable to connect to deb.debian.org:80: 37.71 Err:3 http://deb.debian.org/debian-security bookworm-security InRelease 37.71 Unable to connect to deb.debian.org:80: 37.71 Reading package lists... 37.72 W: Failed to fetch http://deb.debian.org/debian/dists/bookworm/InRelease Could not connect to deb.debian.org:80 (199.232.46.132), connection timed out 37.72 W: Failed to fetch http://deb.debian.org/debian/dists/bookworm-updates/InRelease Unable to connect to deb.debian.org:80: 37.72 W: Failed to fetch http://deb.debian.org/debian-security/dists/bookworm-security/InRelease Unable to connect to deb.debian.org:80: 37.72 W: Some index files failed to download. They have been ignored, or old ones used instead. 37.72 Reading package lists... 37.73 Building dependency tree... 37.73 Reading state information... 37.73 E: Unable to locate package libldap2-dev ------ time="2024-07-24T14:59:07+08:00" level=warning msg="current commit information was not captured by the build" error="git was not found in the system: exec: \"git.exe\": executable file not found in %PATH%" failed to solve: process "/bin/sh -c apt-get update && apt-get install -y libldap2-dev && apt-get clean && rm -rf /var/lib/apt/lists/*" did not complete successfully: exit code: 100
解决方案
方法1:构建时传递代理参数
直接在docker build命令中通过--build-arg传递代理环境变量,让构建容器内的进程能获取到代理配置:
docker build \ --build-arg http_proxy=http://username:password@proxy.com:3128 \ --build-arg https_proxy=http://username:password@proxy.com:3128 \ --build-arg no_proxy=localhost,127.0.0.1 \ -t eqp-workspace .
方法2:修改Dockerfile添加代理配置
方式A:临时设置容器环境变量
在执行apt命令前,先设置代理环境变量,完成后可选择清理避免敏感信息遗留:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 # 设置代理环境变量 ENV http_proxy=http://username:password@proxy.com:3128 ENV https_proxy=http://username:password@proxy.com:3128 ENV no_proxy=localhost,127.0.0.1 RUN apt-get update && \ apt-get install -y libldap2-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # 清理代理环境变量 ENV http_proxy="" ENV https_proxy="" ENV no_proxy=""
方式B:配置apt专属代理
直接生成apt的代理配置文件,仅对apt命令生效:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 # 配置apt代理 RUN echo "Acquire::http::Proxy \"http://username:password@proxy.com:3128/\";" > /etc/apt/apt.conf.d/00proxy && \ echo "Acquire::https::Proxy \"http://username:password@proxy.com:3128/\";" >> /etc/apt/apt.conf.d/00proxy && \ apt-get update && \ apt-get install -y libldap2-dev && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ # 清理代理配置文件 rm /etc/apt/apt.conf.d/00proxy
方法3:配置Docker Buildx全局代理
如果使用Docker Buildx(默认构建工具),可配置全局构建代理,无需每次构建传参:
- 编辑
~/.docker/config.json,添加代理配置:
{ "proxies": { "default": { "httpProxy": "http://username:password@proxy.com:3128", "httpsProxy": "http://username:password@proxy.com:3128", "noProxy": "localhost,127.0.0.1" } } }
- 重启Docker服务:
sudo systemctl restart docker
关键注意事项
- 验证WSL网络连通性:在WSL内执行
curl http://deb.debian.org,确认能通过代理访问目标地址。 - Docker Desktop联动配置:若WSL使用Docker Desktop的Docker服务,需确保Docker Desktop的代理已开启,且勾选"Use the same proxy settings as Windows"。
- 敏感信息防护:避免将代理的用户名密码硬编码到Dockerfile中,优先使用
--build-arg或环境变量传递。
内容的提问来源于stack exchange,提问作者Lan Lin
相关产品推荐
相关产品推荐

