Dockerfile 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. # syntax=docker/dockerfile:1.7
  2. # ---- Stage 1: build the web frontend ----
  3. FROM node:20-alpine AS web-builder
  4. WORKDIR /web
  5. COPY web/package.json web/package-lock.json* ./
  6. RUN npm ci
  7. COPY web/ ./
  8. RUN npm run build
  9. # ---- Stage 2: build the Go binary ----
  10. FROM golang:1.25-alpine AS go-builder
  11. RUN apk add --no-cache git
  12. WORKDIR /src
  13. ARG VERSION=0.1.0-dev
  14. ARG BUILD_TIME=""
  15. COPY go.mod go.sum ./
  16. RUN go mod download
  17. COPY . .
  18. # Overlay the freshly built frontend so go:embed web/dist picks it up.
  19. COPY --from=web-builder /web/dist ./web/dist
  20. RUN CGO_ENABLED=0 GOOS=linux go build \
  21. -trimpath \
  22. -ldflags "-s -w -X vocat/internal/buildinfo.Version=${VERSION} -X vocat/internal/buildinfo.BuildTime=${BUILD_TIME}" \
  23. -o /out/vocat \
  24. ./cmd/vocat
  25. # ---- Stage 3: minimal runtime ----
  26. FROM alpine:3.20
  27. RUN apk add --no-cache ca-certificates tzdata && \
  28. addgroup -S -g 1000 vocat && \
  29. adduser -S -D -H -u 1000 -G vocat vocat
  30. RUN mkdir -p /opt/vocat/bin /opt/vocat/data && \
  31. chown -R vocat:vocat /opt/vocat
  32. COPY --from=go-builder /out/vocat /opt/vocat/bin/vocat
  33. USER vocat
  34. VOLUME ["/opt/vocat/data"]
  35. EXPOSE 7575
  36. ENV VOCAT_ADDR=0.0.0.0:7575 \
  37. VOCAT_DATABASE_PATH=/opt/vocat/data/vocat.db
  38. ENTRYPOINT ["/opt/vocat/bin/vocat"]