From 6f4e7f04cc722b5967e5441cc0112f7abd372b93 Mon Sep 17 00:00:00 2001 From: dela Date: Sun, 24 May 2026 21:40:23 +0800 Subject: [PATCH] build: pass module proxy to docker builder --- .env.example | 4 ++++ Dockerfile | 18 +++++++++++++++++- Makefile | 1 + README.md | 4 +++- ai/risk-guardrails.md | 1 + docker-compose.yml | 8 ++++++++ 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index e08397e..ec02a81 100644 --- a/.env.example +++ b/.env.example @@ -17,6 +17,10 @@ APP_ENV=production # ---- Binance ---- BINANCE_BASE_URL=https://fapi.binance.com +# ---- Go module build ---- +# 国内构建推荐 goproxy.cn;海外可改为 https://proxy.golang.org,direct +GOPROXY=https://goproxy.cn,direct + # ---- 国内网络代理(如不需要可留空)---- # 例如 http://host.docker.internal:7890 HTTP_PROXY= diff --git a/Dockerfile b/Dockerfile index 257b28a..8e6e906 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,24 @@ FROM golang:1.23-alpine AS builder +ARG GOPROXY=https://proxy.golang.org,direct +ARG HTTP_PROXY +ARG HTTPS_PROXY +ARG NO_PROXY +ARG http_proxy +ARG https_proxy +ARG no_proxy + +ENV GOPROXY=${GOPROXY} \ + HTTP_PROXY=${HTTP_PROXY} \ + HTTPS_PROXY=${HTTPS_PROXY} \ + NO_PROXY=${NO_PROXY} \ + http_proxy=${http_proxy} \ + https_proxy=${https_proxy} \ + no_proxy=${no_proxy} + WORKDIR /src COPY go.mod go.sum* ./ -RUN go mod download || true +RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o /out/app ./cmd/app \ && CGO_ENABLED=0 GOOS=linux go build -o /out/backfill ./cmd/backfill diff --git a/Makefile b/Makefile index 724dab3..c72c7ef 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,7 @@ guard: @echo "G13.2 (compose fixed app port)..." && grep -q 'APP_HOST_PORT' docker-compose.yml && grep -q 'APP_PORT: "8080"' docker-compose.yml && ! grep -q '$${APP_PORT' docker-compose.yml @echo "G13.3 (compose migrations gated)..." && grep -q 'service_healthy' docker-compose.yml && grep -q 'service_completed_successfully' docker-compose.yml @echo "G13.4 (dockerignore protects env)..." && grep -qx '.env' .dockerignore && grep -qx '.env.\*' .dockerignore + @echo "G13.5 (docker build proxy explicit)..." && grep -q 'GOPROXY:' docker-compose.yml && grep -q 'ARG GOPROXY' Dockerfile && ! grep -q 'go mod download || true' Dockerfile @echo "all guards green" docker-up: diff --git a/README.md b/README.md index 7fb7963..57ed494 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,8 @@ curl -s 'localhost:8080/v1/market/context?symbol=BTCUSDT' | jq 'keys' # 1. 准备环境变量 cp .env.example .env # 编辑 .env,必须填写 POSTGRES_PASSWORD(留空时 compose 直接拒绝启动) -# 国内机器还要填 HTTP_PROXY / HTTPS_PROXY +# 国内机器还要确认 GOPROXY,并按需填写 HTTP_PROXY / HTTPS_PROXY +# 如果 .env 是旧文件,补一行:GOPROXY=https://goproxy.cn,direct # 2. 启动(自动建表) docker compose up -d @@ -233,6 +234,7 @@ collector: | `POSTGRES_DSN` | 覆盖 yaml 中的 DSN(Docker Compose 里就是这么干的) | | `APP_PORT` | HTTP 端口;compose 部署中容器内固定为 8080 | | `APP_HOST_PORT` | docker compose 暴露到宿主机的 HTTP 端口 | +| `GOPROXY` | Docker build 阶段下载 Go module 使用的代理 | | `HTTPS_PROXY` | 走代理访问 Binance | --- diff --git a/ai/risk-guardrails.md b/ai/risk-guardrails.md index ce5de63..35013c5 100644 --- a/ai/risk-guardrails.md +++ b/ai/risk-guardrails.md @@ -230,6 +230,7 @@ grep -rn --include="*.go" "float64\|float32" internal/entity - `.dockerignore` 必须排除 `.env` 和 `.env.*`,防止 `Dockerfile` 的 `COPY . .` 把 secrets 送进 build context / builder layer。 - app 容器内端口固定为 8080;宿主机暴露端口只通过 `APP_HOST_PORT` 调整。不要在 compose 中用 `${APP_PORT}` 同时控制容器内监听和宿主机映射。 - app 必须等待 Postgres healthcheck 通过、migration init container 成功退出后再启动。 +- Docker build 阶段必须显式传入 `GOPROXY` / HTTP(S) proxy build args;`go mod download` 失败必须立刻失败,禁止 `go mod download || true`。 **为什么**:这个服务虽然不接 Binance 私钥,但 DB 密码和代理凭据仍可能出现在 `.env`。同时 app 启动前若表不存在,会导致 collector/API 失败;端口变量混用会让健康检查和端口映射分叉。 diff --git a/docker-compose.yml b/docker-compose.yml index 0fc1fef..23c7928 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -44,6 +44,14 @@ services: build: context: . dockerfile: Dockerfile + args: + GOPROXY: ${GOPROXY:-https://goproxy.cn,direct} + HTTP_PROXY: ${HTTP_PROXY:-} + HTTPS_PROXY: ${HTTPS_PROXY:-} + NO_PROXY: ${NO_PROXY:-} + http_proxy: ${HTTP_PROXY:-} + https_proxy: ${HTTPS_PROXY:-} + no_proxy: ${NO_PROXY:-} container_name: crypto-hermes-market-gateway depends_on: postgres: