FROM golang:1.24-alpine AS build WORKDIR /src # Dependencies first: this layer is reused whenever only source files change. COPY go.mod go.sum ./ RUN go mod download COPY . . ARG VERSION=dev RUN CGO_ENABLED=0 go build \ -trimpath \ -ldflags="-s -w -X main.version=${VERSION}" \ -o /out/syncbot . FROM alpine:3.22 LABEL org.opencontainers.image.title="syncbot" \ org.opencontainers.image.description="Mirrors git repositories from a source to a destination on a timer." \ org.opencontainers.image.licenses="MIT" # git and ssh do the actual transfer work; syncbot only orchestrates them. RUN apk add --no-cache git openssh-client ca-certificates tzdata \ && adduser -D -H -u 10001 syncbot \ && mkdir -p /var/lib/syncbot /etc/syncbot \ && chown -R syncbot:syncbot /var/lib/syncbot COPY --from=build /out/syncbot /usr/local/bin/syncbot USER syncbot # Mount the config read-only at this path, or override it with -config. ENTRYPOINT ["/usr/local/bin/syncbot"] CMD ["-config", "/etc/syncbot/config.toml"]