Déploiement Linux + Docker
Le SDK SecureExchanges.Signature.NetCore utilise Chromium en mode headless (via PuppeteerSharp) pour certifier les PDFs. Sur un hôte Linux, Chromium a besoin de librairies système spécifiques et d'une disposition reproductible des fichiers. Cette page documente le Dockerfile et les dépendances apt requises pour exécuter le SDK dans un container Linux.
Cette configuration est réutilisable sur n'importe quel hôte de container Linux : Azure Functions, Azure Container Apps, Azure App Service (Linux), Kubernetes, etc.
Prérequis
- Un projet .NET 8+ qui référence
SecureExchanges.Signature.NetCore - Docker Desktop ou un builder cloud (par exemple
az acr build) - Une version de Chrome for Testing alignée sur celle que PuppeteerSharp attend
Dockerfile
Build multi-stage. L'étape 1 compile le projet .NET. L'étape 2 installe les dépendances système de Chromium, télécharge Chrome for Testing et copie la sortie compilée.
Note
Le Dockerfile ci-dessous cible Azure Functions (il utilise l'image de base Functions et définit des variables d'environnement propres à Functions). Il peut aussi être lancé localement avec docker build + docker run pour test.
Pour d'autres hôtes (Container Apps, App Service, Kubernetes), remplacez l'image runtime par mcr.microsoft.com/dotnet/aspnet:8.0 (ou équivalent) et ajustez l'entrypoint en conséquence.
Tip
Un exemple fonctionnel est disponible sur GitHub : AzureFunctionsSignature.netCore.
# Azure Functions .NET 8 Isolated Worker with headless Chromium.
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["AzureFunctionsSignature.netCore.csproj", "./"]
RUN dotnet restore "AzureFunctionsSignature.netCore.csproj"
COPY . .
RUN dotnet publish "AzureFunctionsSignature.netCore.csproj" \
-c Release \
-o /app/publish \
--no-restore \
/p:UseAppHost=false
FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0 AS runtime
# Chromium runtime dependencies for Debian bookworm.
# If a future Chrome version crashes with "error while loading shared libraries: libXXX.so",
# add the lib here and rebuild.
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
fonts-liberation \
libasound2 \
libatk-bridge2.0-0 \
libatk1.0-0 \
libcairo2 \
libcups2 \
libdbus-1-3 \
libdrm2 \
libexpat1 \
libfontconfig1 \
libgbm1 \
libglib2.0-0 \
libnspr4 \
libnss3 \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libx11-6 \
libx11-xcb1 \
libxcb1 \
libxcomposite1 \
libxcursor1 \
libxdamage1 \
libxext6 \
libxfixes3 \
libxi6 \
libxkbcommon0 \
libxrandr2 \
libxrender1 \
libxshmfence1 \
libxss1 \
libxtst6 \
wget \
unzip \
&& rm -rf /var/lib/apt/lists/*
# Chrome for Testing — version must match the one bundled with PuppeteerSharp.
# Check available versions: https://googlechromelabs.github.io/chrome-for-testing/
ARG CHROME_VERSION=146.0.7680.153
RUN wget -q "https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/linux64/chrome-linux64.zip" \
-O /tmp/chrome.zip \
&& mkdir -p /home/site/wwwroot/chromium \
&& unzip -q /tmp/chrome.zip -d /home/site/wwwroot/chromium \
&& chmod +x /home/site/wwwroot/chromium/chrome-linux64/chrome \
&& rm /tmp/chrome.zip
# Chromium is already present in the image — block PuppeteerSharp from re-downloading it at runtime.
# One worker per instance = one Chromium process shared = lower RAM footprint.
ENV SE_DISABLE_AUTO_DOWNLOAD=1 \
FUNCTIONS_WORKER_PROCESS_COUNT=1
COPY --from=build /app/publish /home/site/wwwroot
Librairies système requises
Chromium n'embarque pas ses propres dépendances ; elles doivent être fournies par l'hôte. La liste apt-get install ci-dessus couvre les librairies dont Chromium a besoin pour démarrer sur Debian bookworm.
Si un futur build Chromium échoue avec error while loading shared libraries: libXXX.so: cannot open shared object file, ajoutez le package manquant à la liste apt-get install et rebuildez.
Version de Chrome for Testing
PuppeteerSharp livre avec une version de Chrome for Testing attendue. L'image doit installer cette version exacte (ou une proche compatible). La table ci-dessous suit la version de Chrome requise par chaque release du SDK :
Version de SecureExchanges.Signature.NetCore |
Version de Chrome for Testing |
|---|---|
| 26.4.23.1 et ultérieures | 146.0.7680.153 |
Si vous utilisez une version plus récente du SDK non listée ici :
- Identifiez la version attendue par PuppeteerSharp (au runtime, Puppeteer télécharge dans
/tmp/Chrome/Linux-<version>/). - Choisissez un build correspondant sur le dashboard Chrome for Testing.
- Définissez le build arg
CHROME_VERSIONdans le Dockerfile.
Un écart de version entre le binaire installé et celui attendu par PuppeteerSharp peut causer des échecs de lancement ou des différences subtiles de rendu.
Variables d'environnement
| Variable | Rôle |
|---|---|
SE_PUPPETEER_EXECUTABLE_PATH |
Chemin absolu vers un binaire Chromium. Prime sur toutes les autres étapes de résolution. |
SE_DISABLE_AUTO_DOWNLOAD |
Mettre à 1 ou true pour empêcher PuppeteerSharp de télécharger Chromium au runtime. Recommandé quand l'image embarque déjà Chromium (comme dans le Dockerfile ci-dessus). |
Note :
FUNCTIONS_WORKER_PROCESS_COUNTest spécifique à Azure Functions et est couverte dans Déploiement Azure Functions.
Étapes suivantes
- Pour Azure Functions spécifiquement — ACR, managed identity, association de l'image à une Function App — voir Déploiement Azure Functions.
- Pour l'utilisation du SDK elle-même, voir Certification PDF.
- Pour un projet d'exemple fonctionnel complet, voir AzureFunctionsSignature.netCore sur GitHub.