Invite de conteneurisation ASP.NET .NET Framework
Conteneurisez le projet ASP.NET (.NET Framework) spécifié dans les paramètres de conteneurisation ci-dessous, en vous concentrant exclusivement sur les modifications requises pour que l'application s'exécute dans un conteneur Docker Windows. La conteneurisation doit tenir compte de tous les paramètres spécifiés ici.
RAPPEL : Ceci est une application .NET Framework, pas .NET Core. Le processus de conteneurisation sera différent de celui d'une application .NET Core.
Paramètres de conteneurisation
Cette section de l'invite contient les paramètres et configurations spécifiques requis pour conteneuriser l'application ASP.NET (.NET Framework). Avant d'exécuter cette invite, assurez-vous que les paramètres sont remplis avec les informations nécessaires. Notez que dans de nombreux cas, seuls les premiers paramètres sont requis. Les paramètres ultérieurs peuvent être laissés aux valeurs par défaut s'ils ne s'appliquent pas au projet à conteneuriser.
Tous les paramètres non spécifiés seront définis sur des valeurs par défaut. Les valeurs par défaut sont fournies entre [crochets].
Informations de base sur le projet
-
Projet à conteneuriser :
[NomDuProjet (fournir le chemin du fichier .csproj)]
-
SKU Windows Server à utiliser :
[Windows Server Core (Par défaut) ou Windows Server Full]
-
Version Windows Server à utiliser :
[2022, 2019 ou 2016 (Par défaut 2022)]
-
Image de base personnalisée pour l'étape de build de l'image Docker (« None » pour utiliser l'image de base Microsoft standard) :
[Spécifier l'image de base à utiliser pour l'étape de build (Par défaut None)]
-
Image de base personnalisée pour l'étape d'exécution de l'image Docker (« None » pour utiliser l'image de base Microsoft standard) :
[Spécifier l'image de base à utiliser pour l'étape d'exécution (Par défaut None)]
Configuration du conteneur
-
Ports qui doivent être exposés dans l'image conteneur :
- Port HTTP principal :
[par ex., 80] - Ports supplémentaires :
[Lister tous les ports supplémentaires, ou « None »]
- Port HTTP principal :
-
Compte utilisateur sous lequel le conteneur doit s'exécuter :
[Compte utilisateur, ou par défaut « ContainerUser »]
-
Paramètres IIS qui doivent être configurés dans l'image conteneur :
[Lister tous les paramètres IIS spécifiques, ou « None »]
Configuration du build
-
Étapes de build personnalisées qui doivent être effectuées avant la création de l'image conteneur :
[Lister toutes les étapes de build spécifiques, ou « None »]
-
Étapes de build personnalisées qui doivent être effectuées après la création de l'image conteneur :
[Lister toutes les étapes de build spécifiques, ou « None »]
Dépendances
-
Assemblages .NET qui doivent être enregistrés dans le GAC dans l'image conteneur :
[Nom et version de l'assembly, ou « None »]
-
MSI qui doivent être copiés dans l'image conteneur et installés :
[Noms et versions des MSI, ou « None »]
-
Composants COM qui doivent être enregistrés dans l'image conteneur :
[Noms des composants COM, ou « None »]
Configuration système
-
Clés et valeurs de registre qui doivent être ajoutées à l'image conteneur :
[Chemins et valeurs du registre, ou « None »]
-
Variables d'environnement qui doivent être définies dans l'image conteneur :
[Noms et valeurs des variables, ou « Utiliser les valeurs par défaut »]
-
Rôles et fonctionnalités Windows Server qui doivent être installés dans l'image conteneur :
[Noms des rôles/fonctionnalités, ou « None »]
Système de fichiers
-
Fichiers/répertoires qui doivent être copiés dans l'image conteneur :
[Chemins relatifs à la racine du projet, ou « None »]- Emplacement cible dans le conteneur :
[Chemins du conteneur, ou « Non applicable »]
-
Fichiers/répertoires à exclure de la conteneurisation :
[Chemins à exclure, ou « None »]
Configuration .dockerignore
- Motifs à inclure dans le fichier
.dockerignore(le fichier .dockerignore inclura déjà les valeurs par défaut communes ; voici les motifs supplémentaires) :- Motifs supplémentaires :
[Lister tous les motifs supplémentaires, ou « None »]
- Motifs supplémentaires :
Configuration de la vérification de santé
-
Point de terminaison de vérification de santé :
[Chemin URL de vérification de santé, ou « None »]
-
Intervalle et délai d'expiration de la vérification de santé :
[Valeurs d'intervalle et de délai d'expiration, ou « Utiliser les valeurs par défaut »]
Instructions supplémentaires
-
Autres instructions qui doivent être suivies pour conteneuriser le projet :
[Exigences spécifiques, ou « None »]
-
Problèmes connus à résoudre :
[Décrire les problèmes connus, ou « None »]
Portée
- ✅ Modification de la configuration de l'application pour garantir que les générateurs de configuration sont utilisés pour lire les paramètres de l'application et les chaînes de connexion à partir des variables d'environnement
- ✅ Création et configuration du Dockerfile pour une application ASP.NET
- ✅ Spécification de plusieurs étapes dans le Dockerfile pour compiler/publier l'application et copier la sortie dans l'image finale
- ✅ Configuration de la compatibilité de la plateforme conteneur Windows (Windows Server Core ou Full)
- ✅ Gestion appropriée des dépendances (assemblages GAC, MSI, composants COM)
- ❌ Aucune configuration d'infrastructure (supposée être traitée séparément)
- ❌ Aucune modification de code au-delà de ce qui est requis pour la conteneurisation
Processus d'exécution
- Examinez les paramètres de conteneurisation ci-dessus pour comprendre les exigences de conteneurisation
- Créez un fichier
progress.mdpour suivre les modifications avec des cases à cocher - Déterminez la version .NET Framework à partir du fichier .csproj du projet en vérifiant l'élément
TargetFrameworkVersion - Sélectionnez l'image conteneur Windows Server appropriée en fonction de :
- La version .NET Framework détectée à partir du projet
- Le SKU Windows Server spécifié dans les paramètres de conteneurisation (Core ou Full)
- La version Windows Server spécifiée dans les paramètres de conteneurisation (2016, 2019 ou 2022)
- Les tags Windows Server Core peuvent être trouvés à : https://github.com/microsoft/dotnet-framework-docker/blob/main/README.aspnet.md#full-tag-listing
- Assurez-vous que les packages NuGet requis sont installés. N'installez PAS ces derniers s'ils sont manquants. S'ils ne sont pas installés, l'utilisateur doit les installer manuellement. S'ils ne sont pas installés, pausez l'exécution de cette invite et demandez à l'utilisateur de les installer à l'aide du gestionnaire de packages NuGet de Visual Studio ou de la console du gestionnaire de packages Visual Studio. Les packages suivants sont requis :
Microsoft.Configuration.ConfigurationBuilders.Environment
- Modifiez le fichier
web.configpour ajouter la section des générateurs de configuration et les paramètres pour lire les paramètres de l'application et les chaînes de connexion à partir des variables d'environnement :- Ajouter la section ConfigBuilders dans configSections
- Ajouter la section configBuilders à la racine
- Configurer EnvironmentConfigBuilder pour les paramètres et les chaînes de connexion
- Modèle d'exemple :
<configSections> <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" /> </configSections> <configBuilders> <builders> <add name="Environment" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment" /> </builders> </configBuilders> <appSettings configBuilders="Environment"> <!-- paramètres existants --> </appSettings> <connectionStrings configBuilders="Environment"> <!-- chaînes de connexion existantes --> </connectionStrings>
- Créez un fichier
LogMonitorConfig.jsondans le dossier où le Dockerfile sera créé en copiant le fichier de référenceLogMonitorConfig.jsonà la fin de cette invite. Le contenu du fichier NE DOIT PAS être modifié et doit correspondre exactement au contenu de référence sauf si les instructions des paramètres de conteneurisation le spécifient autrement.- En particulier, assurez-vous que le niveau des problèmes à consigner n'est pas modifié car l'utilisation du niveau
Informationpour les sources EventLog causera un bruit inutile.
- En particulier, assurez-vous que le niveau des problèmes à consigner n'est pas modifié car l'utilisation du niveau
- Créez un Dockerfile à la racine du répertoire du projet pour conteneuriser l'application
- Le Dockerfile doit utiliser plusieurs étapes :
- Étape de build : Utilisez une image Windows Server Core pour compiler l'application
- L'étape de build DOIT utiliser une image de base
mcr.microsoft.com/dotnet/framework/sdksauf si une image de base personnalisée est spécifiée dans le fichier de paramètres - Copiez d'abord les fichiers sln, csproj et packages.config
- Copiez NuGet.config s'il existe et configurez les flux privés
- Restaurez les packages NuGet
- Ensuite, copiez le reste du code source et compilez et publiez l'application sur C:\publish à l'aide de MSBuild
- L'étape de build DOIT utiliser une image de base
- Étape finale : Utilisez l'image Windows Server sélectionnée pour exécuter l'application
- L'étape finale DOIT utiliser une image de base
mcr.microsoft.com/dotnet/framework/aspnetsauf si une image de base personnalisée est spécifiée dans le fichier de paramètres - Copiez le fichier
LogMonitorConfig.jsondans un répertoire du conteneur (par ex., C:\LogMonitor) - Téléchargez LogMonitor.exe depuis le référentiel Microsoft dans le même répertoire
- L'URL correcte de LogMonitor.exe est : https://github.com/microsoft/windows-container-tools/releases/download/v2.1.1/LogMonitor.exe
- Définissez le répertoire de travail sur C:\inetpub\wwwroot
- Copiez la sortie publiée de l'étape de build (dans C:\publish) dans l'image finale
- Définissez le point d'entrée du conteneur pour exécuter LogMonitor.exe avec ServiceMonitor.exe pour surveiller le service IIS
ENTRYPOINT [ "C:\\LogMonitor\\LogMonitor.exe", "C:\\ServiceMonitor.exe", "w3svc" ]
- L'étape finale DOIT utiliser une image de base
- Étape de build : Utilisez une image Windows Server Core pour compiler l'application
- Assurez-vous de tenir compte de toutes les exigences des paramètres de conteneurisation :
- SKU et version Windows Server
- Ports exposés
- Compte utilisateur pour le conteneur
- Paramètres IIS
- Enregistrement des assemblages GAC
- Installation des MSI
- Enregistrement des composants COM
- Clés de registre
- Variables d'environnement
- Rôles et fonctionnalités Windows
- Copie de fichiers/répertoires
- Modélisez le Dockerfile d'après l'exemple fourni à la fin de cette invite, mais assurez-vous qu'il est personnalisé selon les exigences et paramètres spécifiques du projet.
- IMPORTANT : Utilisez une image de base Windows Server Core sauf si l'utilisateur a spécifiquement demandé une image Windows Server complète dans le fichier de paramètres
- Le Dockerfile doit utiliser plusieurs étapes :
- Créez un fichier
.dockerignoreà la racine du répertoire du projet pour exclure les fichiers inutiles de l'image Docker. Le fichier.dockerignoreDOIT inclure au moins les éléments suivants ainsi que les motifs supplémentaires spécifiés dans les paramètres de conteneurisation :- packages/
- bin/
- obj/
- .dockerignore
- Dockerfile
- .git/
- .github/
- .vs/
- .vscode/
- **/node_modules/
- *.user
- *.suo
- **/.DS_Store
- **/Thumbs.db
- Tous les motifs supplémentaires spécifiés dans les paramètres de conteneurisation
- Configurez les vérifications de santé si spécifiées dans les paramètres :
- Ajoutez l'instruction HEALTHCHECK au Dockerfile si un point de terminaison de vérification de santé est fourni
- Ajoutez le dockerfile au projet en ajoutant l'élément suivant au fichier de projet :
<None Include="Dockerfile" /> - Marquez les tâches comme complétées : [ ] → [✓]
- Continuez jusqu'à ce que toutes les tâches soient complètes et que la création Docker réussisse
Vérification de la création et de l'exécution
Confirmez que la création Docker réussit une fois le Dockerfile terminé. Utilisez la commande suivante pour créer l'image Docker :
docker build -t aspnet-app:latest .
Si la création échoue, examinez les messages d'erreur et apportez les ajustements nécessaires au Dockerfile ou à la configuration du projet. Signalez le succès ou l'échec.
Suivi de la progression
Maintenez un fichier progress.md avec la structure suivante :
# Progression de la conteneurisation
## Détection de l'environnement
- [ ] Détection de la version .NET Framework (version : ___)
- [ ] Sélection du SKU Windows Server (SKU : ___)
- [ ] Sélection de la version Windows Server (Version : ___)
## Modifications de configuration
- [ ] Modifications de Web.config pour les générateurs de configuration
- [ ] Configuration de la source de packages NuGet (le cas échéant)
- [ ] Copie de LogMonitorConfig.json et ajustement si requis par les paramètres
## Conteneurisation
- [ ] Création du Dockerfile
- [ ] Création du fichier .dockerignore
- [ ] Étape de build créée avec l'image SDK
- [ ] Copie de sln, csproj, packages.config et (le cas échéant) NuGet.config pour la restauration des packages
- [ ] Étape d'exécution créée avec l'image d'exécution
- [ ] Configuration d'utilisateur non root
- [ ] Gestion des dépendances (GAC, MSI, COM, registre, fichiers supplémentaires, etc.)
- [ ] Configuration de la vérification de santé (le cas échéant)
- [ ] Implémentation des exigences spéciales
## Vérification
- [ ] Examinez les paramètres de conteneurisation et assurez-vous que toutes les exigences sont satisfaites
- [ ] Succès de la création Docker
Ne pausez pas pour confirmation entre les étapes. Continuez méthodiquement jusqu'à ce que l'application soit conteneurisée et que la création Docker réussisse.
VOUS N'AVEZ PAS TERMINÉ JUSQU'À CE QUE TOUTES LES CASES À COCHER SOIENT COCHÉES ! Cela inclut la création réussie de l'image Docker et la résolution de tous les problèmes qui surviennent pendant le processus de création.
Matériels de référence
Exemple de Dockerfile
Un exemple de Dockerfile pour une application ASP.NET (.NET Framework) utilisant une image de base Windows Server Core.
# escape=`
# La directive escape change le caractère d'échappement de \ à `
# Ceci est particulièrement utile dans les Dockerfile Windows où \ est le séparateur de chemin
# ============================================================
# Étape 1 : Compilez et publiez l'application
# ============================================================
# Image de base - Sélectionnez la version appropriée de .NET Framework et Windows Server Core
# Les tags possibles incluent :
# - 4.8.1-windowsservercore-ltsc2025 (Windows Server 2025)
# - 4.8-windowsservercore-ltsc2022 (Windows Server 2022)
# - 4.8-windowsservercore-ltsc2019 (Windows Server 2019)
# - 4.8-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.7.2-windowsservercore-ltsc2019 (Windows Server 2019)
# - 4.7.2-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.7.1-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.7-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.6.2-windowsservercore-ltsc2016 (Windows Server 2016)
# - 3.5-windowsservercore-ltsc2025 (Windows Server 2025)
# - 3.5-windowsservercore-ltsc2022 (Windows Server 2022)
# - 3.5-windowsservercore-ltsc2019 (Windows Server 2019)
# - 3.5-windowsservercore-ltsc2019 (Windows Server 2016)
# Utilise l'image du SDK .NET Framework pour compiler l'application
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2022 AS build
ARG BUILD_CONFIGURATION=Release
# Définissez le shell par défaut sur PowerShell
SHELL ["powershell", "-command"]
WORKDIR /app
# Copiez les fichiers solution et projet
COPY YourSolution.sln .
COPY YourProject/*.csproj ./YourProject/
COPY YourOtherProject/*.csproj ./YourOtherProject/
# Copiez les fichiers packages.config
COPY YourProject/packages.config ./YourProject/
COPY YourOtherProject/packages.config ./YourOtherProject/
# Restaurez les packages NuGet
RUN nuget restore YourSolution.sln
# Copiez le code source
COPY . .
# Effectuez les étapes de pré-build personnalisées ici, si nécessaire
# Compilez et publiez l'application sur C:\publish
RUN msbuild /p:Configuration=$BUILD_CONFIGURATION `
/p:WebPublishMethod=FileSystem `
/p:PublishUrl=C:\publish `
/p:DeployDefaultTarget=WebPublish
# Effectuez les étapes de post-build personnalisées ici, si nécessaire
# ============================================================
# Étape 2 : Image d'exécution finale
# ============================================================
# Image de base - Sélectionnez la version appropriée de .NET Framework et Windows Server Core
# Les tags possibles incluent :
# - 4.8.1-windowsservercore-ltsc2025 (Windows Server 2025)
# - 4.8-windowsservercore-ltsc2022 (Windows Server 2022)
# - 4.8-windowsservercore-ltsc2019 (Windows Server 2019)
# - 4.8-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.7.2-windowsservercore-ltsc2019 (Windows Server 2019)
# - 4.7.2-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.7.1-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.7-windowsservercore-ltsc2016 (Windows Server 2016)
# - 4.6.2-windowsservercore-ltsc2016 (Windows Server 2016)
# - 3.5-windowsservercore-ltsc2025 (Windows Server 2025)
# - 3.5-windowsservercore-ltsc2022 (Windows Server 2022)
# - 3.5-windowsservercore-ltsc2019 (Windows Server 2019)
# - 3.5-windowsservercore-ltsc2019 (Windows Server 2016)
# Utilise l'image ASP.NET .NET Framework pour exécuter l'application
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2022
# Définissez le shell par défaut sur PowerShell
SHELL ["powershell", "-command"]
WORKDIR /inetpub/wwwroot
# Copiez depuis l'étape de build
COPY --from=build /publish .
# Ajoutez toutes les variables d'environnement supplémentaires nécessaires pour votre application (décommentez et modifiez selon les besoins)
# ENV KEY=VALUE
# Installez les packages MSI (décommentez et modifiez selon les besoins)
# COPY ./msi-installers C:/Installers
# RUN Start-Process -Wait -FilePath 'msiexec.exe' -ArgumentList '/i', 'C:\Installers\your-package.msi', '/quiet', '/norestart'
# Installez les rôles et fonctionnalités Windows Server personnalisés (décommentez et modifiez selon les besoins)
# RUN dism /Online /Enable-Feature /FeatureName:YOUR-FEATURE-NAME
# Ajoutez des fonctionnalités Windows supplémentaires (décommentez et modifiez selon les besoins)
# RUN Add-WindowsFeature Some-Windows-Feature; `
# Add-WindowsFeature Another-Windows-Feature
# Installez les packages MSI si nécessaire (décommentez et modifiez selon les besoins)
# COPY ./msi-installers C:/Installers
# RUN Start-Process -Wait -FilePath 'msiexec.exe' -ArgumentList '/i', 'C:\Installers\your-package.msi', '/quiet', '/norestart'
# Enregistrez les assemblages dans le GAC si nécessaire (décommentez et modifiez selon les besoins)
# COPY ./assemblies C:/Assemblies
# RUN C:\Windows\Microsoft.NET\Framework64\v4.0.30319\gacutil -i C:/Assemblies/YourAssembly.dll
# Enregistrez les composants COM si nécessaire (décommentez et modifiez selon les besoins)
# COPY ./com-components C:/Components
# RUN regsvr32 /s C:/Components/YourComponent.dll
# Ajoutez des clés de registre si nécessaire (décommentez et modifiez selon les besoins)
# RUN New-Item -Path 'HKLM:\Software\YourApp' -Force; `
# Set-ItemProperty -Path 'HKLM:\Software\YourApp' -Name 'Setting' -Value 'Value'
# Configurez les paramètres IIS si nécessaire (décommentez et modifiez selon les besoins)
# RUN Import-Module WebAdministration; `
# Set-ItemProperty 'IIS:\AppPools\DefaultAppPool' -Name somePropertyName -Value 'SomePropertyValue'; `
# Set-ItemProperty 'IIS:\Sites\Default Web Site' -Name anotherPropertyName -Value 'AnotherPropertyValue'
# Exposez les ports nécessaires - Par défaut, IIS utilise le port 80
EXPOSE 80
# EXPOSE 443 # Décommentez si vous utilisez HTTPS
# Copiez LogMonitor depuis le référentiel microsoft/windows-container-tools
WORKDIR /LogMonitor
RUN curl -fSLo LogMonitor.exe https://github.com/microsoft/windows-container-tools/releases/download/v2.1.1/LogMonitor.exe
# Copiez LogMonitorConfig.json depuis les fichiers locaux
COPY LogMonitorConfig.json .
# Définissez l'utilisateur non administrateur
USER ContainerUser
# Remplacez le point d'entrée par défaut du conteneur pour bénéficier de LogMonitor
ENTRYPOINT [ "C:\\LogMonitor\\LogMonitor.exe", "C:\\ServiceMonitor.exe", "w3svc" ]
Adaptation de cet exemple
Remarque : Personnalisez ce modèle en fonction des exigences spécifiques des paramètres de conteneurisation.
Lors de l'adaptation de ce Dockerfile exemple :
- Remplacez
YourSolution.sln,YourProject.csproj, etc. par les noms de vos fichiers réels - Ajustez les versions Windows Server et .NET Framework selon les besoins
- Modifiez les étapes d'installation des dépendances en fonction de vos exigences et supprimez les étapes inutiles
- Ajoutez ou supprimez des étapes selon les besoins pour votre flux de travail spécifique
Remarques sur la dénomination des étapes
- La syntaxe
AS stage-namedonne un nom à chaque étape - Utilisez
--from=stage-namepour copier des fichiers à partir d'une étape précédente - Vous pouvez avoir plusieurs étapes intermédiaires qui ne sont pas utilisées dans l'image finale
LogMonitorConfig.json
Le fichier LogMonitorConfig.json doit être créé à la racine du répertoire du projet. Il est utilisé pour configurer l'outil LogMonitor, qui surveille les journaux dans le conteneur. Le contenu de ce fichier doit ressembler exactement à ceci pour garantir une fonctionnalité de journalisation appropriée :
{
"LogConfig": {
"sources": [
{
"type": "EventLog",
"startAtOldestRecord": true,
"eventFormatMultiLine": false,
"channels": [
{
"name": "system",
"level": "Warning"
},
{
"name": "application",
"level": "Error"
}
]
},
{
"type": "File",
"directory": "c:\\inetpub\\logs",
"filter": "*.log",
"includeSubdirectories": true,
"includeFileNames": false
},
{
"type": "ETW",
"eventFormatMultiLine": false,
"providers": [
{
"providerName": "IIS: WWW Server",
"providerGuid": "3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83",
"level": "Information"
},
{
"providerName": "Microsoft-Windows-IIS-Logging",
"providerGuid": "7E8AD27F-B271-4EA2-A783-A47BDE29143B",
"level": "Information"
}
]
}
]
}
}