forked from yibaiba/hideck
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile.github
More file actions
131 lines (111 loc) · 4.56 KB
/
Copy pathDockerfile.github
File metadata and controls
131 lines (111 loc) · 4.56 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# syntax=docker/dockerfile:1.10
# HiDeck multi-platform image for local Buildx and CI builds.
# 构建阶段 1: 前端构建 (Frontend)
# 使用 --platform=$BUILDPLATFORM 强制在构建机本地架构(通常是amd64)运行
# 避免在 arm64 构建时使用 QEMU 模拟,大幅提升速度且产物跨平台通用
FROM --platform=$BUILDPLATFORM node:24-alpine AS frontend-builder
ARG BUILDPLATFORM
WORKDIR /app/web
COPY web/package*.json ./
# 挂载 npm 缓存,加速依赖安装
RUN --mount=type=cache,target=/root/.npm,id=npm-${BUILDPLATFORM},sharing=locked \
npm ci --no-audit --no-fund
COPY web/ .
RUN npm run build
# 构建阶段 2: 后端构建 (Backend)
FROM --platform=$BUILDPLATFORM golang:1.26.4-alpine AS backend-builder
ARG BUILDPLATFORM
ARG VERSION=unknown
ARG BUILDTIME=unknown
ARG REVISION=unknown
ARG ENABLE_UPX=0
WORKDIR /app
ENV PATH="/usr/local/go/bin:${PATH}"
# 使用镜像内置的已修复 Go 工具链,避免构建时隐式下载工具链
ENV GOTOOLCHAIN=local
ENV GOWORK=off
# 安装构建依赖
RUN apk add --no-cache git
# 复制 go mod 文件
COPY go.mod go.sum ./
COPY third_party ./third_party
# 挂载 Go 模块缓存,加速依赖下载
ARG TARGETOS
ARG TARGETARCH
RUN --mount=type=cache,target=/go/pkg/mod,id=gomod-${TARGETOS}-${TARGETARCH},sharing=locked \
go mod download
# 复制源代码
COPY . .
# 复制构建好的前端资源到 internal/web/dist 以便嵌入
COPY --from=frontend-builder /app/web/dist ./internal/web/dist/
# 验证前端资源已复制
RUN ls -la internal/web/dist/ && echo "Frontend assets copied successfully"
# 整理依赖并编译二进制
# 挂载 Go 构建缓存和模块缓存,加速重复构建
RUN --mount=type=cache,target=/root/.cache/go-build,id=gobuild-${TARGETOS}-${TARGETARCH},sharing=locked \
--mount=type=cache,target=/go/pkg/mod,id=gomod-${TARGETOS}-${TARGETARCH},sharing=locked \
BUILD_TIME="${BUILDTIME}" && \
if [ -z "${BUILD_TIME}" ] || [ "${BUILD_TIME}" = "unknown" ]; then \
BUILD_TIME="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"; \
fi && \
CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \
go build -mod=readonly -trimpath -buildvcs=false -tags "with_utls nomsgpack" -ldflags "-s -w -X 'github.com/yibaiba/hideck/internal/global.Version=${VERSION}' -X 'github.com/yibaiba/hideck/internal/global.BuildTime=${BUILD_TIME}'" -o hideck ./cmd/hideck && \
if [ "${ENABLE_UPX}" = "1" ] || [ "${ENABLE_UPX}" = "true" ]; then \
echo "UPX enabled, compressing binary..."; \
(apk add --no-cache upx >/dev/null 2>&1 || apk add --no-cache upx-ucl >/dev/null 2>&1 || true); \
if command -v upx >/dev/null 2>&1; then \
upx --best --lzma /app/hideck; \
else \
echo "UPX package not available, skip compression."; \
fi; \
else \
echo "UPX disabled."; \
fi && \
ls -lh /app/hideck
# 运行时基础层
FROM alpine:3.24 AS runtime-base
ARG VERSION=unknown
ARG BUILDTIME=unknown
ARG REVISION=unknown
WORKDIR /app
LABEL org.opencontainers.image.title="HiDeck" \
org.opencontainers.image.description="Qualcomm modem management platform" \
org.opencontainers.image.source="https://github.com/yibaiba/hideck" \
org.opencontainers.image.version=${VERSION} \
org.opencontainers.image.created=${BUILDTIME} \
org.opencontainers.image.revision=${REVISION}
# - ca-certificates / tzdata: 基础 HTTPS 与时区支持
# - opencore-amr / vo-amrwbenc: AMR 与 AMR-WB 实时编解码
# - lame-libs: 双向混音录音的 MP3 编码
# - psmisc: 提供 fuser,用于安全释放串口占用
# - libqmi: QMI Proxy 模式需要的 /usr/libexec/qmi-proxy
RUN apk add --no-cache \
ca-certificates \
gcompat \
lame-libs \
libqmi \
opencore-amr \
psmisc \
tzdata \
vo-amrwbenc && \
test -e /usr/lib/libopencore-amrnb.so.0 && \
test -e /usr/lib/libopencore-amrwb.so.0 && \
test -e /usr/lib/libvo-amrwbenc.so.0 && \
test -e /usr/lib/libmp3lame.so.0 && \
test -x /usr/libexec/qmi-proxy
# 管理 HTTP、电话 HTTPS、WebRTC UDP mux
EXPOSE 7575/tcp 7576/tcp 7580/udp
# 运行阶段 (Runtime)
FROM runtime-base AS runtime
# 复制二进制文件
COPY --from=backend-builder /app/hideck /usr/local/bin/hideck
# 创建配置和数据目录
RUN mkdir -p config data logs
# 默认配置路径环境变量
ENV CONFIG_PATH=/app/config/config.yaml
ENV TZ=Asia/Shanghai
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
CMD wget -q -T 3 -O /dev/null http://127.0.0.1:7575/ping || exit 1
STOPSIGNAL SIGTERM
ENTRYPOINT ["/usr/local/bin/hideck"]
CMD ["-c", "/app/config/config.yaml"]