A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
1# Production build for ATCR AppView
2# Result: ~30MB scratch image with static binary
3FROM docker.io/golang:1.25.7-trixie AS builder
4
5ENV DEBIAN_FRONTEND=noninteractive
6
7RUN apt-get update && \
8 apt-get install -y --no-install-recommends libsqlite3-dev nodejs npm && \
9 rm -rf /var/lib/apt/lists/*
10
11WORKDIR /app
12
13COPY go.mod go.sum ./
14RUN go mod download
15
16COPY . .
17
18RUN npm ci
19RUN go generate ./...
20
21RUN CGO_ENABLED=1 go build \
22 -ldflags="-s -w -linkmode external -extldflags '-static'" \
23 -tags sqlite_omit_load_extension \
24 -trimpath \
25 -o atcr-appview ./cmd/appview
26
27RUN CGO_ENABLED=0 go build \
28 -ldflags="-s -w" \
29 -trimpath \
30 -o healthcheck ./cmd/healthcheck
31
32# Minimal runtime
33FROM scratch
34
35COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
36COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo
37COPY --from=builder /app/atcr-appview /atcr-appview
38COPY --from=builder /app/healthcheck /healthcheck
39
40EXPOSE 5000
41
42LABEL org.opencontainers.image.title="ATCR AppView" \
43 org.opencontainers.image.description="ATProto Container Registry - OCI-compliant registry using AT Protocol for manifest storage" \
44 org.opencontainers.image.authors="ATCR Contributors" \
45 org.opencontainers.image.source="https://tangled.org/evan.jarrett.net/at-container-registry" \
46 org.opencontainers.image.documentation="https://tangled.org/evan.jarrett.net/at-container-registry" \
47 org.opencontainers.image.licenses="MIT" \
48 org.opencontainers.image.version="0.1.0" \
49 io.atcr.icon="https://imgs.blue/evan.jarrett.net/1TpTNrRelfloN2emuWZDrWmPT0o93bAjEnozjD6UPgoVV9m4" \
50 io.atcr.readme="https://tangled.org/evan.jarrett.net/at-container-registry/raw/main/docs/appview.md"
51
52ENTRYPOINT ["/atcr-appview"]
53CMD ["serve"]