树莓派4+Docker Compose环境下Go mod下载依赖失败求助
go mod download失败 环境与配置
Go微服务Dockerfile
# Build FROM golang:alpine AS build # Destination of copy WORKDIR /build # Download dependencies COPY go.mod ./ COPY go.sum ./ RUN go mod download # Copy source code COPY . ./ # Build RUN go build -o bin ./cmd/main.go # Deploy FROM alpine RUN adduser -S -D -H -h /app appuser USER appuser COPY --from=build /build/bin /app/ WORKDIR /app EXPOSE 8080 CMD ["./bin"]
Docker Compose配置(compose.yaml)
services: redis: image: redis:alpine ports: - "6379:6379" postgres: image: postgres:alpine ports: - "5432:5432" environment: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} volumes: - ../loquegasto-backend/migrations/core.sql:/docker-entrypoint-initdb.d/1-core.sql - ../loquegasto-backend/migrations/core.categories.sql:/docker-entrypoint-initdb.d/2-core.categories.sql - ../loquegasto-backend/migrations/core.transactions.sql:/docker-entrypoint-initdb.d/3-core.transactions.sql - ../loquegasto-backend/migrations/core.users.sql:/docker-entrypoint-initdb.d/4-core.users.sql - ../loquegasto-backend/migrations/core.wallets.sql:/docker-entrypoint-initdb.d/5-core.wallets.sql healthcheck: test: ["CMD-SHELL", "pg_isready"] interval: 10s timeout: 5s retries: 3 lqg-backend: build: ../loquegasto-backend environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_HOST=postgres - POSTGRES_PORT=5432 - JWT_SECRET=${JWT_SECRET} - PORT=8080 depends_on: postgres: condition: service_healthy lqg-telegram: build: ../loquegasto-telegram links: - "redis" - "lqg-backend" environment: - JWT_SECRET=${JWT_SECRET} - TELEGRAM_TOKEN=${TELEGRAM_TOKEN} - BACKEND_URL=http://lqg-backend:8080 - EXPORTER_FILE_PATH=lqg-export - REDIS_HOST=redis:6379 - PORT=8080 depends_on: - redis - lqg-backend
问题现象
在MacOS上执行docker compose up --build -d可正常运行,但在树莓派4上执行时,多次出现go mod download步骤失败,错误示例:
> [loquegasto-infra-lqg-backend build 5/7] RUN go mod download: #0 1.623 go: github.com/Masterminds/squirrel@v1.5.1: Get "https://proxy.golang.org/github.com/%21masterminds/squirrel/@v/v1.5.1.mod": dial tcp: lookup proxy.golang.org on [2800:810:100:1:200:115:192:28]:53: dial udp [2800:810:100:1:200:115:192:28]:53: connect: cannot assign requested address ------ failed to solve: executor failed running [/bin/sh -c go mod download]: exit code: 1
错误表现不稳定:有时单个依赖出错,有时所有依赖失败;有时其中一个微服务构建失败,有时是另一个。
解决建议
禁用IPv6解析:从错误日志看是IPv6 DNS解析失败,可在Docker构建阶段强制Go使用IPv4。修改Dockerfile中的
go mod download步骤:RUN GOFLAGS="-net=ipv4" go mod download也可以在Docker daemon层面全局禁用IPv6:编辑
/etc/docker/daemon.json添加以下内容,然后重启Docker服务(sudo systemctl restart docker):{ "ipv6": false, "fixed-cidr-v6": "" }更换Go模块代理:如果
proxy.golang.org访问不稳定,可替换为更稳定的代理服务,在Dockerfile中添加环境变量后再执行下载:ENV GOPROXY=https://goproxy.io,direct RUN go mod download复用本地依赖缓存:在树莓派上先单独进入每个微服务目录,执行
go mod download把依赖下载到本地Go缓存;然后修改Docker Compose的构建配置,挂载本地缓存到构建容器,避免重复下载:lqg-backend: build: context: ../loquegasto-backend volumes: - $HOME/go/pkg/mod:/go/pkg/mod # 其他配置保持不变注意:需保证树莓派本地Go版本与Dockerfile中
golang:alpine的Go版本一致。检查树莓派网络配置:确认树莓派的DNS服务器配置正常,可临时修改
/etc/resolv.conf使用公共DNS(如8.8.8.8或114.114.114.114),测试ping proxy.golang.org是否能正常解析和连通。
内容的提问来源于stack exchange,提问作者Lucas Bacelo

