# syntax=docker/dockerfile:1.7 # # Local-dev image for the backend service. Mirrors the structure of # `backend/Dockerfile` (the integration/production image) but switches # the runtime stage to alpine so docker-compose healthchecks can shell # out to `wget` and the container can run as root for Docker-socket # access without needing the production-grade nonroot guarantees. # # Build via the local-dev compose: `make -C tools/local-dev up`. The # build context is the repository root. FROM golang:1.26.2-alpine AS builder WORKDIR /src ENV CGO_ENABLED=0 GOFLAGS=-trimpath COPY pkg/cronutil/ ./pkg/cronutil/ COPY pkg/error/ ./pkg/error/ COPY pkg/geoip/ ./pkg/geoip/ COPY pkg/model/ ./pkg/model/ COPY pkg/postgres/ ./pkg/postgres/ COPY pkg/schema/ ./pkg/schema/ COPY pkg/transcoder/ ./pkg/transcoder/ COPY pkg/util/ ./pkg/util/ COPY backend/ ./backend/ RUN <<'EOF' cat > go.work go 1.26.2 use ( ./backend ./pkg/cronutil ./pkg/error ./pkg/geoip ./pkg/model ./pkg/postgres ./pkg/schema ./pkg/transcoder ./pkg/util ) replace ( galaxy/cronutil v0.0.0 => ./pkg/cronutil galaxy/error v0.0.0 => ./pkg/error galaxy/geoip v0.0.0 => ./pkg/geoip galaxy/model v0.0.0 => ./pkg/model galaxy/postgres v0.0.0 => ./pkg/postgres galaxy/schema v0.0.0 => ./pkg/schema galaxy/transcoder v0.0.0 => ./pkg/transcoder galaxy/util v0.0.0 => ./pkg/util ) EOF RUN --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg/mod \ go build -o /out/backend ./backend/cmd/backend FROM alpine:3.20 AS runtime LABEL org.opencontainers.image.title="galaxy-backend-local-dev" RUN apk add --no-cache wget ca-certificates EXPOSE 8080 EXPOSE 8081 COPY --from=builder /out/backend /usr/local/bin/backend ENTRYPOINT ["/usr/local/bin/backend"]