53 lines
1.4 KiB
Docker
53 lines
1.4 KiB
Docker
ARG IMAGE_PREFIX=
|
|
|
|
FROM --platform=$BUILDPLATFORM ${IMAGE_PREFIX}node:20-alpine AS web-builder
|
|
|
|
WORKDIR /src/web
|
|
COPY web/package.json web/package-lock.json web/.npmrc ./
|
|
RUN npm ci
|
|
COPY web/src ./src
|
|
COPY web/public ./public
|
|
COPY web/index.html web/tsconfig.json web/tsconfig.app.json web/tsconfig.node.json web/vite.config.ts ./
|
|
RUN npm run build
|
|
|
|
FROM --platform=$BUILDPLATFORM ${IMAGE_PREFIX}golang:1.25-alpine AS go-builder
|
|
|
|
ARG TARGETARCH=amd64
|
|
ARG GOPROXY=https://goproxy.cn,direct
|
|
ARG GOSUMDB=sum.golang.google.cn
|
|
ENV CGO_ENABLED=0 GOPROXY=${GOPROXY} GOSUMDB=${GOSUMDB}
|
|
|
|
WORKDIR /src
|
|
COPY go.mod go.sum ./
|
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
|
go mod download
|
|
|
|
COPY cmd/ ./cmd/
|
|
COPY internal/ ./internal/
|
|
COPY --from=web-builder /src/web/dist ./internal/api/static/
|
|
|
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
|
--mount=type=cache,target=/root/.cache/go-build \
|
|
GOOS=linux GOARCH="$TARGETARCH" \
|
|
go build -trimpath -ldflags="-w -s" -o /app ./cmd/app
|
|
|
|
ARG IMAGE_PREFIX=
|
|
FROM ${IMAGE_PREFIX}alpine:3.20
|
|
|
|
ARG APK_MIRROR=mirrors.aliyun.com
|
|
RUN sed -i "s/dl-cdn.alpinelinux.org/${APK_MIRROR}/g" /etc/apk/repositories \
|
|
&& apk add --no-cache ca-certificates tzdata tini
|
|
|
|
ENV APP_DATA=/data \
|
|
APP_ADDR=:8080
|
|
|
|
COPY --from=go-builder /app /usr/local/bin/app
|
|
|
|
RUN adduser -D -H app
|
|
USER app
|
|
|
|
VOLUME ["/data"]
|
|
EXPOSE 8080
|
|
ENTRYPOINT ["/sbin/tini", "--"]
|
|
CMD ["/usr/local/bin/app", "-data", "/data", "-addr", ":8080"]
|