FROM alpine:latest AS source ARG ECH0_TAG=4.2.1 RUN apk add --no-cache git ca-certificates RUN git clone --depth 1 --branch "v${ECH0_TAG}" https://github.com/lin-snow/Ech0.git /src FROM node:25-alpine AS frontend-builder WORKDIR /web RUN npm install -g pnpm@10.32.1 COPY --from=source /src/web/package.json /src/web/pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile COPY --from=source /src/web/ ./ RUN pnpm run build --mode production FROM golang:1.26.1-alpine AS backend-builder RUN apk add --no-cache git ca-certificates tzdata gcc musl-dev WORKDIR /app COPY --from=source /src/go.mod /src/go.sum ./ RUN go mod download COPY --from=source /src/ ./ COPY --from=frontend-builder /template/dist /app/template/dist ARG TARGETOS ARG TARGETARCH RUN CGO_ENABLED=1 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build \ -tags netgo \ -ldflags="-linkmode external -extldflags '-static' -w -s" \ -o ech0 ./cmd/ech0 FROM alpine:latest WORKDIR /app ENV TZ=Asia/Shanghai RUN mkdir -p /app/data /app/backup /app/template COPY --from=backend-builder /app/ech0 /app/ech0 RUN chmod +x /app/ech0 EXPOSE 6277 EXPOSE 6278 ENTRYPOINT ["/app/ech0"] CMD ["serve"]