`Halo.Metadata` fehlte in der Liste der Projektdateien, die vor dem Wiederherstellen kopiert werden — der Bau auf dem Arbeitsrechner lief weiter, der im Container wäre gescheitert. Genau die Art Fehler, die eine Liste erzeugt: beim nächsten Projekt wird sie wieder vergessen. Jetzt ein Muster statt einer Liste (`COPY --parents src/*/*.csproj ./`). Die Ebenenzwischenablage für das Wiederherstellen bleibt dabei erhalten. **Gegen den laufenden Container geprüft**, nicht nur gebaut: zwei Bibliotheken angelegt, gescannt, Ergebnis abgerufen. - Drei Filme gefunden, die danebenliegende `.srt` nicht. - „Blade Runner 2049" behielt seine Zahl und bekam 2017 als Jahr. - Sortiert ohne Artikel: Blade Runner, Matrix, Untergang. - „Dark" mit zwei Folgen — mit `@eaDir` wären es drei gewesen. - Folgentitel „Geheimnisse" und „Lügen" aus den Dateinamen gelesen. - Ohne TMDB-Schlüssel meldet der Bericht das Nachschlagen als übersprungen, und die Mediathek steht trotzdem da. Nebenbei bestätigt: die Meldung für einen Pfad, den es im Container nicht gibt, traf zu, als Colimas Dateifreigabe `/private/tmp` nicht durchreichte. Sie nannte genau den Grund. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
51 lines
2.0 KiB
Docker
51 lines
2.0 KiB
Docker
# syntax=docker/dockerfile:1
|
|
|
|
# Gebaut wird auf der Architektur des Bauwirts, übersetzt wird für die des
|
|
# Ziels — `dotnet publish -a` kann das. Ohne diese Trennung liefe der Bau für
|
|
# arm64 unter Emulation und dauerte ein Vielfaches.
|
|
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
ARG TARGETARCH
|
|
WORKDIR /src
|
|
|
|
# Erst die Projektdateien, dann wiederherstellen: so bleibt die
|
|
# Paket-Wiederherstellung in der Ebenenzwischenablage, solange sich keine
|
|
# Abhängigkeit ändert. Ohne diesen Schritt lädt jeder Bau alles neu.
|
|
# `--parents` behält die Verzeichnisse bei. **Ein Muster statt einer Liste**,
|
|
# weil eine Liste bei jedem neuen Projekt vergessen wird — und dann scheitert
|
|
# erst der Bau im Container, nicht der auf dem Arbeitsrechner.
|
|
COPY --parents src/*/*.csproj ./
|
|
RUN dotnet restore src/Halo.Api/Halo.Api.csproj -a $TARGETARCH
|
|
|
|
COPY . .
|
|
RUN dotnet publish src/Halo.Api/Halo.Api.csproj -a $TARGETARCH -c Release -o /app --no-restore
|
|
|
|
|
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
|
|
# **Die Verzeichnisse müssen hier angelegt werden, nicht erst beim Start.**
|
|
# Docker legt den Einhängepunkt eines frischen benannten Volumes sonst als
|
|
# `root` an und übernimmt für ein leeres Volume die Rechte aus dem Image —
|
|
# gibt es das Verzeichnis im Image nicht, erbt es `root:root`, und der erste
|
|
# Start scheitert für jeden, der kein Bind Mount benutzt.
|
|
RUN mkdir -p /config /cache /transcode && chown -R 1000:1000 /config /cache /transcode
|
|
|
|
# **Kein root.** Die Kennung 1000 ist die des ersten Benutzers auf fast jedem
|
|
# Linux und auf den üblichen NAS-Geräten — wessen Dateien anders gehören, setzt
|
|
# in der Compose-Datei `user: "<uid>:<gid>"`. Das ist Docker-Bordmittel und
|
|
# braucht weder ein Startskript noch root im Container.
|
|
USER 1000:1000
|
|
|
|
ENV HALO_DATA=/config \
|
|
HALO_CACHE=/cache \
|
|
HALO_TRANSCODE=/transcode \
|
|
ASPNETCORE_URLS=http://+:8080 \
|
|
DOTNET_gcServer=0
|
|
|
|
WORKDIR /app
|
|
COPY --from=build /app .
|
|
|
|
EXPOSE 8080
|
|
VOLUME ["/config", "/cache", "/transcode"]
|
|
|
|
ENTRYPOINT ["dotnet", "Halo.Api.dll"]
|