DockerFile für Azure AppService für Container / Fonts und Logging

Hallo zusammen,

wie sind eure Erfahrungswerte / Best Practices beim Erstellen von Containern mit List&Label.
Folgendermaßen sieht mein Dockerfile aktuell aus:

FROM mcr.microsoft.com/dotnet/aspnet:7.0.14-windowsservercore-ltsc2022 as base

WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:7.0.404-1-windowsservercore-ltsc2022 as builder
COPY . /app

WORKDIR /app/<APPFOLDER>
RUN dotnet restore 

WORKDIR /app/<APPFOLDER>
RUN dotnet build -c Release -o /result/APPNAME

FROM builder AS publish
RUN dotnet publish -c Release -o /result

FROM base AS final
WORKDIR /app
COPY --from=publish /result .

ENTRYPOINT ["dotnet", "appname.dll"]

Wie importiert ihr Schriftarten etc. am besten? (Unsere Docker Images werden über CI (Azure DevOps) erstellt). Welche Pfade nehmt ihr für das Logging - der Zugriff auf den Container ist ja nicht so trivial.

Vielen Dank!

Hallo Matthias,

unsere Empfehlung ist, wie auch in deinem Dockerfile zu sehen, Windows Server Core Docker-Images zu verwenden. Bei Nano Server Docker-Images fehlt nahezu die gesamte Windows API. Folgenden KB Artikel gibt es zu diesem Thema:

Bei unseren Tests hat das mit den Schriftarten folgendermaßen am besten funktioniert. Dem Visual Studio Projekt haben wir einen Ordner mit den benötigten Fonts hinzugefügt. Im Dockerfile werden diese in das Verzeichnis “c:/windows/fonts/” kopiert:

…
WORKDIR /src
#Copy the fonts
COPY ["MVC Web Reporting Sample/fonts/", "c:/windows/fonts/"]
…

Beim Start der Anwendung kannst du mit Hilfe der Windows API AddFontResource die Fonts für die aktuelle Session installieren:

[DllImport("gdi32.dll")]
static extern int  AddFontResource (string lpFilename);
AddFontResource(@"c:\Windows\Fonts\<Fontname>.ttf");

Beim Logging würden wir hier folgendermaßen vorgehen:

LlSetDebug(LL_DEBUG_CMBTLL | LL_DEBUG_CMBTLL_LOGTOFILE);
LlSetOptionString(-1, LL_OPTIONSTR_LOGFILEPATH, “debwin.log”);

Damit wird das “debwin.log“ im Startverzeichnis der Anwendung erstellt. Wenn es sich um eine Web-Anwendung handelt, könnte man hier noch Button für den Download des Logs zur Verfügung stellen. Ansonsten hat man wohl keine andere Wahl als die Datei aus dem Container zu kopieren:

docker cp ConatinerID:“debwin.log“ “Lokaler Pfad\debwin.log”

Bin jetzt nicht ganz sicher, aber möglichweise muss vorher der Container gestoppt werden.