-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
75 lines (59 loc) · 2.14 KB
/
Dockerfile
File metadata and controls
75 lines (59 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# ---- Builder stage ----
FROM golang:1.26-alpine AS builder
WORKDIR /build
# 安装构建依赖
RUN apk add --no-cache git make
# Go 代理设置(从宿主机传递)
ARG GOPROXY=https://proxy.golang.org,direct
ARG GOSUMDB=sum.golang.org
ENV GOPROXY=${GOPROXY}
ENV GOSUMDB=${GOSUMDB}
# 依赖缓存层
COPY go.mod go.sum ./
RUN go mod download
# 构建参数(版本信息)
ARG VERSION=dev
ARG GIT_COMMIT=unknown
ARG GIT_BRANCH=unknown
ARG BUILD_TIME=unknown
ARG GO_VERSION=unknown
ARG BUILD_PLATFORM=unknown
# 构建(参数与 make build 保持一致)
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build \
-ldflags="-s -w \
-X 'rua.plus/lolly/internal/version.Version=${VERSION}' \
-X 'rua.plus/lolly/internal/version.GitCommit=${GIT_COMMIT}' \
-X 'rua.plus/lolly/internal/version.GitBranch=${GIT_BRANCH}' \
-X 'rua.plus/lolly/internal/version.BuildTime=${BUILD_TIME}' \
-X 'rua.plus/lolly/internal/version.GoVersion=${GO_VERSION}' \
-X 'rua.plus/lolly/internal/version.BuildPlatform=${BUILD_PLATFORM}'" \
-gcflags="-l=4" \
-asmflags="-l=4" \
-trimpath \
-o /build/lolly \
main.go
# 创建运行时目录结构和默认页面
RUN mkdir -p /etc/lolly /var/www/html && \
echo '<!DOCTYPE html><html><head><title>Lolly</title></head><body><h1>It works!</h1></body></html>' > /var/www/html/index.html
# ---- Tini stage ----
FROM alpine:3.19 AS tini-stage
RUN apk add --no-cache tini-static
# ---- Runtime stage ----
FROM scratch
# CA 证书(出站 HTTPS 代理需要)
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
# 创建配置和静态文件目录
COPY --from=builder /etc/lolly /etc/lolly
COPY --from=builder /var/www/html /var/www/html
# 二进制文件
COPY --from=builder /build/lolly /lolly
# tini 静态版本(处理 PID 1 僵尸进程回收和信号转发)
COPY --from=tini-stage /sbin/tini-static /tini
# 优雅关闭:SIGQUIT 触发 30s graceful stop
STOPSIGNAL SIGQUIT
# HTTP/1.1, HTTP/2, HTTP/3 (QUIC)
EXPOSE 8080/tcp 443/tcp 443/udp
# 使用 tini 作为 init 进程(PID 1)
ENTRYPOINT ["/tini", "--"]
CMD ["/lolly", "-c", "/etc/lolly/lolly.yaml"]