Skip to content

Commit b59ff8a

Browse files
ci: multi-arch docker image
1 parent 004cea4 commit b59ff8a

2 files changed

Lines changed: 87 additions & 0 deletions

File tree

‎.github/workflows/docker.yml‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# 放到 .github/workflows/docker.yml
2+
# 需要:仓库 Variables 里设 DOCKERHUB_USER;Secrets 里设 DOCKERHUB_TOKEN(Docker Hub Access Token)
3+
name: docker
4+
5+
on:
6+
push:
7+
tags: ["v*"]
8+
workflow_dispatch:
9+
10+
jobs:
11+
image:
12+
runs-on: ubuntu-latest
13+
permissions:
14+
contents: read
15+
packages: write # 推 GHCR 用
16+
steps:
17+
- uses: actions/checkout@v4
18+
19+
- uses: docker/setup-buildx-action@v3
20+
21+
- uses: docker/login-action@v3
22+
with:
23+
username: ${{ vars.DOCKERHUB_USER }}
24+
password: ${{ secrets.DOCKERHUB_TOKEN }}
25+
26+
- uses: docker/login-action@v3
27+
with:
28+
registry: ghcr.io
29+
username: ${{ github.actor }}
30+
password: ${{ secrets.GITHUB_TOKEN }}
31+
32+
- id: meta
33+
uses: docker/metadata-action@v5
34+
with:
35+
images: |
36+
docker.io/${{ vars.DOCKERHUB_USER }}/json-ping
37+
ghcr.io/${{ github.repository_owner }}/json-ping
38+
tags: |
39+
type=semver,pattern={{version}}
40+
type=semver,pattern={{major}}.{{minor}}
41+
type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/v') }}
42+
43+
- uses: docker/build-push-action@v6
44+
with:
45+
context: .
46+
platforms: linux/amd64,linux/arm64,linux/arm/v7
47+
push: true
48+
tags: ${{ steps.meta.outputs.tags }}
49+
labels: ${{ steps.meta.outputs.labels }}
50+
build-args: VERSION=${{ github.ref_name }}
51+
provenance: false # 避免部分平台(如 RouterOS)解析 manifest 时遇到 attestation 条目
52+
cache-from: type=gha
53+
cache-to: type=gha,mode=max

‎Dockerfile‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# syntax=docker/dockerfile:1
2+
# JSON-PING multi-arch image: linux/amd64, linux/arm64, linux/arm/v7
3+
# Go 交叉编译在构建机原生架构上完成,不走 QEMU 模拟,速度快。
4+
5+
ARG GO_VERSION=1.26 # 与 go.mod 保持一致
6+
7+
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine AS build
8+
ARG TARGETOS TARGETARCH TARGETVARIANT
9+
ARG VERSION=dev
10+
WORKDIR /src
11+
COPY . .
12+
# TARGETVARIANT 形如 v7 → GOARM=7;amd64/arm64 时为空,无影响
13+
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH GOARM=${TARGETVARIANT#v} \
14+
go build -trimpath -tags timetzdata \
15+
-ldflags="-s -w -X main.version=${VERSION}" \
16+
-o /out/json-ping . \
17+
&& mkdir -p /out/data
18+
19+
FROM scratch
20+
# HTTPS 告警(webhook)需要 CA 证书;时区数据已通过 timetzdata 编进二进制
21+
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
22+
COPY --from=build /out/json-ping /json-ping
23+
# scratch 里无法 mkdir/chown,数据目录在构建阶段建好再带权限拷入
24+
COPY --from=build --chown=65532:65532 /out/data /data
25+
26+
VOLUME /data
27+
EXPOSE 8080
28+
USER 65532:65532
29+
30+
# scratch 没有 curl/wget,需要二进制自带 healthcheck 子命令
31+
HEALTHCHECK --interval=30s --timeout=3s CMD ["/json-ping", "healthcheck"]
32+
33+
ENTRYPOINT ["/json-ping"]
34+
CMD ["-data", "/data", "-listen", ":8080"]

0 commit comments

Comments
 (0)