build: pass module proxy to docker builder
This commit is contained in:
@@ -17,6 +17,10 @@ APP_ENV=production
|
|||||||
# ---- Binance ----
|
# ---- Binance ----
|
||||||
BINANCE_BASE_URL=https://fapi.binance.com
|
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://host.docker.internal:7890
|
||||||
HTTP_PROXY=
|
HTTP_PROXY=
|
||||||
|
|||||||
18
Dockerfile
18
Dockerfile
@@ -1,8 +1,24 @@
|
|||||||
FROM golang:1.23-alpine AS builder
|
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
|
WORKDIR /src
|
||||||
COPY go.mod go.sum* ./
|
COPY go.mod go.sum* ./
|
||||||
RUN go mod download || true
|
RUN go mod download
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN CGO_ENABLED=0 GOOS=linux go build -o /out/app ./cmd/app \
|
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
|
&& CGO_ENABLED=0 GOOS=linux go build -o /out/backfill ./cmd/backfill
|
||||||
|
|||||||
1
Makefile
1
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.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.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.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"
|
@echo "all guards green"
|
||||||
|
|
||||||
docker-up:
|
docker-up:
|
||||||
|
|||||||
@@ -108,7 +108,8 @@ curl -s 'localhost:8080/v1/market/context?symbol=BTCUSDT' | jq 'keys'
|
|||||||
# 1. 准备环境变量
|
# 1. 准备环境变量
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
# 编辑 .env,必须填写 POSTGRES_PASSWORD(留空时 compose 直接拒绝启动)
|
# 编辑 .env,必须填写 POSTGRES_PASSWORD(留空时 compose 直接拒绝启动)
|
||||||
# 国内机器还要填 HTTP_PROXY / HTTPS_PROXY
|
# 国内机器还要确认 GOPROXY,并按需填写 HTTP_PROXY / HTTPS_PROXY
|
||||||
|
# 如果 .env 是旧文件,补一行:GOPROXY=https://goproxy.cn,direct
|
||||||
|
|
||||||
# 2. 启动(自动建表)
|
# 2. 启动(自动建表)
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
@@ -233,6 +234,7 @@ collector:
|
|||||||
| `POSTGRES_DSN` | 覆盖 yaml 中的 DSN(Docker Compose 里就是这么干的) |
|
| `POSTGRES_DSN` | 覆盖 yaml 中的 DSN(Docker Compose 里就是这么干的) |
|
||||||
| `APP_PORT` | HTTP 端口;compose 部署中容器内固定为 8080 |
|
| `APP_PORT` | HTTP 端口;compose 部署中容器内固定为 8080 |
|
||||||
| `APP_HOST_PORT` | docker compose 暴露到宿主机的 HTTP 端口 |
|
| `APP_HOST_PORT` | docker compose 暴露到宿主机的 HTTP 端口 |
|
||||||
|
| `GOPROXY` | Docker build 阶段下载 Go module 使用的代理 |
|
||||||
| `HTTPS_PROXY` | 走代理访问 Binance |
|
| `HTTPS_PROXY` | 走代理访问 Binance |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -230,6 +230,7 @@ grep -rn --include="*.go" "float64\|float32" internal/entity
|
|||||||
- `.dockerignore` 必须排除 `.env` 和 `.env.*`,防止 `Dockerfile` 的 `COPY . .` 把 secrets 送进 build context / builder layer。
|
- `.dockerignore` 必须排除 `.env` 和 `.env.*`,防止 `Dockerfile` 的 `COPY . .` 把 secrets 送进 build context / builder layer。
|
||||||
- app 容器内端口固定为 8080;宿主机暴露端口只通过 `APP_HOST_PORT` 调整。不要在 compose 中用 `${APP_PORT}` 同时控制容器内监听和宿主机映射。
|
- app 容器内端口固定为 8080;宿主机暴露端口只通过 `APP_HOST_PORT` 调整。不要在 compose 中用 `${APP_PORT}` 同时控制容器内监听和宿主机映射。
|
||||||
- app 必须等待 Postgres healthcheck 通过、migration init container 成功退出后再启动。
|
- 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 失败;端口变量混用会让健康检查和端口映射分叉。
|
**为什么**:这个服务虽然不接 Binance 私钥,但 DB 密码和代理凭据仍可能出现在 `.env`。同时 app 启动前若表不存在,会导致 collector/API 失败;端口变量混用会让健康检查和端口映射分叉。
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,14 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
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
|
container_name: crypto-hermes-market-gateway
|
||||||
depends_on:
|
depends_on:
|
||||||
postgres:
|
postgres:
|
||||||
|
|||||||
Reference in New Issue
Block a user