A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
atcr.io
docker
container
atproto
go
1FROM docker.io/golang:1.25.4-trixie AS builder
2
3ENV DEBIAN_FRONTEND=noninteractive
4
5RUN apt-get update && \
6 apt-get install -y --no-install-recommends sqlite3 libsqlite3-dev && \
7 rm -rf /var/lib/apt/lists/*
8
9WORKDIR /build
10
11COPY go.mod go.sum ./
12RUN go mod download
13
14COPY . .
15
16RUN CGO_ENABLED=1 go build \
17 -ldflags="-s -w -linkmode external -extldflags '-static'" \
18 -tags sqlite_omit_load_extension \
19 -trimpath \
20 -o atcr-hold ./cmd/hold
21
22# ==========================================
23# Stage 2: Minimal FROM scratch runtime
24# ==========================================
25FROM scratch
26
27# Copy CA certificates for HTTPS (PDS connections)
28COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
29# Copy timezone data for timestamp formatting
30COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
31# Copy optimized binary (SQLite embedded)
32COPY --from=builder /build/atcr-hold /atcr-hold
33
34# Expose default port
35EXPOSE 8080
36
37# OCI image annotations
38LABEL org.opencontainers.image.title="ATCR Hold Service" \
39 org.opencontainers.image.description="ATCR Hold Service - Bring Your Own Storage component for ATCR" \
40 org.opencontainers.image.authors="ATCR Contributors" \
41 org.opencontainers.image.source="https://tangled.org/evan.jarrett.net/at-container-registry" \
42 org.opencontainers.image.documentation="https://tangled.org/evan.jarrett.net/at-container-registry" \
43 org.opencontainers.image.licenses="MIT" \
44 org.opencontainers.image.version="0.1.0" \
45 io.atcr.icon="https://imgs.blue/evan.jarrett.net/1TpTOdtS60GdJWBYEqtK22y688jajbQ9a5kbYRFtwuqrkBAE" \
46 io.atcr.readme="https://tangled.org/evan.jarrett.net/at-container-registry/raw/main/docs/hold.md"
47
48ENTRYPOINT ["/atcr-hold"]