From 0c637e2e4863c1799034ba4735d0a703903b65e6 Mon Sep 17 00:00:00 2001 From: David Ficociello Date: Wed, 15 Apr 2026 20:21:59 -0400 Subject: [PATCH 1/2] fix: rename luminarr to prism in Dockerfile and Dockerfile.minimal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both Dockerfiles were inherited byte-for-byte from the original luminarr fork and still referenced luminarr throughout — the Go module ldflag paths, the output binary name, the cmd target, the non-root user in the scratch image, and the ENTRYPOINT. They compiled on luminarr because that repo's go.mod said github.com/luminarr/luminarr, but on prism the go build step immediately fails with "no Go files in ./cmd/luminarr". CI only surfaced this now because the docker job only fires on main-branch pushes (if: github.event_name == 'push' && ref == refs/heads/main), so the failure was hidden during every PR run and only appeared the moment the merge to main triggered the release path. Three places in Dockerfile.minimal also wrote /etc/passwd.luminarr and /etc/group.luminarr for the scratch-image non-root user — those filenames don't affect runtime but were renamed for consistency. Co-Authored-By: Claude Opus 4.6 (1M context) --- docker/Dockerfile | 18 +++++++++--------- docker/Dockerfile.minimal | 22 +++++++++++----------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 33aac1e..729456a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -33,12 +33,12 @@ COPY --from=frontend /app/web/static/ ./web/static/ # modernc/sqlite is pure Go — CGO_ENABLED=0 produces a fully static binary. RUN CGO_ENABLED=0 GOOS=linux go build \ - -ldflags "-X github.com/luminarr/luminarr/internal/version.Version=${VERSION} \ - -X github.com/luminarr/luminarr/internal/version.BuildTime=${BUILD_TIME} \ - -X github.com/luminarr/luminarr/internal/config.DefaultTMDBKey=${TMDB_API_KEY} \ - -X github.com/luminarr/luminarr/internal/config.DefaultTraktClientID=${TRAKT_CLIENT_ID} \ + -ldflags "-X github.com/prism/prism/internal/version.Version=${VERSION} \ + -X github.com/prism/prism/internal/version.BuildTime=${BUILD_TIME} \ + -X github.com/prism/prism/internal/config.DefaultTMDBKey=${TMDB_API_KEY} \ + -X github.com/prism/prism/internal/config.DefaultTraktClientID=${TRAKT_CLIENT_ID} \ -s -w" \ - -o /luminarr ./cmd/luminarr + -o /prism ./cmd/prism # ── Final stage ─────────────────────────────────────────────────────────────── # Alpine with ffmpeg (includes ffprobe) for media scanning out of the box. @@ -47,16 +47,16 @@ FROM alpine:3.21 # ffmpeg pulls in ffprobe. ca-certificates is needed for outbound HTTPS. # tzdata provides timezone data for correct time display. RUN apk add --no-cache ffmpeg ca-certificates tzdata postgresql-client && \ - adduser -D -u 1000 luminarr + adduser -D -u 1000 prism # The binary -COPY --from=builder /luminarr /luminarr +COPY --from=builder /prism /prism # Default data directory (mount a volume here in production) VOLUME ["/config"] EXPOSE 8282 -USER luminarr +USER prism -ENTRYPOINT ["/luminarr"] +ENTRYPOINT ["/prism"] diff --git a/docker/Dockerfile.minimal b/docker/Dockerfile.minimal index 474f109..a629710 100644 --- a/docker/Dockerfile.minimal +++ b/docker/Dockerfile.minimal @@ -16,17 +16,17 @@ COPY . . # modernc/sqlite is pure Go — CGO_ENABLED=0 produces a fully static binary. RUN CGO_ENABLED=0 GOOS=linux go build \ - -ldflags "-X github.com/luminarr/luminarr/internal/version.Version=${VERSION} \ - -X github.com/luminarr/luminarr/internal/version.BuildTime=${BUILD_TIME} \ - -X github.com/luminarr/luminarr/internal/config.DefaultTMDBKey=${TMDB_API_KEY} \ - -X github.com/luminarr/luminarr/internal/config.DefaultTraktClientID=${TRAKT_CLIENT_ID} \ + -ldflags "-X github.com/prism/prism/internal/version.Version=${VERSION} \ + -X github.com/prism/prism/internal/version.BuildTime=${BUILD_TIME} \ + -X github.com/prism/prism/internal/config.DefaultTMDBKey=${TMDB_API_KEY} \ + -X github.com/prism/prism/internal/config.DefaultTraktClientID=${TRAKT_CLIENT_ID} \ -s -w" \ - -o /luminarr ./cmd/luminarr + -o /prism ./cmd/prism # Create a minimal /etc/passwd so the scratch image has a non-root user. # UID/GID 65532 matches the distroless "nonroot" convention. -RUN echo "nonroot:x:65532:65532:nonroot:/:/sbin/nologin" > /etc/passwd.luminarr && \ - echo "nonroot:x:65532:" > /etc/group.luminarr +RUN echo "nonroot:x:65532:65532:nonroot:/:/sbin/nologin" > /etc/passwd.prism && \ + echo "nonroot:x:65532:" > /etc/group.prism # ── Final stage ─────────────────────────────────────────────────────────────── # scratch: zero OS footprint. No ffprobe — media scanning requires host-side @@ -37,11 +37,11 @@ FROM scratch COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ # Minimal passwd/group so the process can run as a named non-root user. -COPY --from=builder /etc/passwd.luminarr /etc/passwd -COPY --from=builder /etc/group.luminarr /etc/group +COPY --from=builder /etc/passwd.prism /etc/passwd +COPY --from=builder /etc/group.prism /etc/group # The binary -COPY --from=builder /luminarr /luminarr +COPY --from=builder /prism /prism # Default data directory (mount a volume here in production) VOLUME ["/config"] @@ -52,4 +52,4 @@ EXPOSE 8282 # or mounted with appropriate permissions, for the process to write to it. USER nonroot:nonroot -ENTRYPOINT ["/luminarr"] +ENTRYPOINT ["/prism"] From eea693ffd378ab24835dbfcb7f30af6461ec1f0f Mon Sep 17 00:00:00 2001 From: David Ficociello Date: Wed, 15 Apr 2026 20:42:46 -0400 Subject: [PATCH 2/2] fix: lowercase the latest-minimal GHCR tag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same issue pilot just hit. The Build and push (minimal) step in ci.yml was using ghcr.io/\${{ github.repository }}:latest-minimal, which preserves the org casing and produces the invalid tag ghcr.io/Beacon-Stack/prism:latest-minimal — GHCR strictly requires lowercase image names. The sibling latest step escapes this by using docker/metadata-action outputs which auto-lowercase; the minimal step hardcodes the tag directly and misses that treatment. Spell the repo explicitly as ghcr.io/beacon-stack/prism. Co-Authored-By: Claude Opus 4.6 (1M context) --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 05fb702..a4e8c39 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -199,7 +199,10 @@ jobs: context: . file: docker/Dockerfile.minimal push: true - tags: ghcr.io/${{ github.repository }}:latest-minimal + # ghcr.io image names must be lowercase. github.repository preserves + # the org casing ("Beacon-Stack/prism"), which GHCR rejects, so we + # spell the repo out explicitly instead of using the expression. + tags: ghcr.io/beacon-stack/prism:latest-minimal labels: ${{ steps.meta.outputs.labels }} build-args: | VERSION=${{ github.sha }}