Best practices for Amazon ECS container images
Une image de conteneur est un ensemble d'instructions expliquant comment créer le conteneur. Une image de conteneur contient le code de votre application et toutes les dépendances dont le code d'application a besoin pour s'exécuter. Les dépendances des applications incluent les packages de code source sur lesquels repose le code de votre application, un environnement d'exécution de langage pour les langages interprétés et les packages binaires sur lesquels repose votre code lié dynamiquement.
Suivez ces directives lors de la conception et de la création de vos images de conteneur :
-
Complétez vos images de conteneur en stockant toutes les dépendances de l'application sous forme de fichiers statiques à l'intérieur de l'image de conteneur.
Si vous modifiez quelque chose dans l’image de conteneur, créez une autre image de conteneur avec les modifications.
-
Exécutez un seul processus de candidature dans un conteneur.
La durée de vie du conteneur est aussi longue que le processus de l'application. Amazon ECS remplace les processus qui ont échoué et détermine où lancer le processus de remplacement. Une image complète rend le déploiement global plus résilient.
-
Faites en sorte que votre application gère le signal
SIGTERM.Lorsque Amazon ECS arrête une tâche, il envoie d’abord un signal SIGTERM à la tâche pour informer l’application qu’elle doit se terminer et s’arrêter. Amazon ECS envoie ensuite un message
SIGKILL. Lorsque les applications ignorent le signalSIGTERM, le service Amazon ECS doit attendre avant d’envoyer le signalSIGKILLpour mettre fin au processus.Vous devez déterminer le temps nécessaire à votre application pour terminer son travail et vous assurer que vos applications gèrent le signal
SIGTERM. Le traitement des signaux de l’application doit empêcher celle-ci d’accepter de nouvelles tâches et terminer celles en cours, ou enregistrer les tâches inachevées dans un espace de stockage externe lorsque leur exécution prend trop de temps. -
Configurez des applications conteneurisées pour écrire des journaux dans
stdoutetstderr.Le découplage de la gestion des journaux de votre code d’application vous offre la flexibilité nécessaire pour ajuster la gestion des journaux au niveau de l’infrastructure. La modification de votre système de journalisation en est un exemple. Au lieu de modifier vos services, de créer et de déployer une nouvelle image de conteneur, vous pouvez ajuster les paramètres.
-
Utilisez des balises pour gérer les versions des images de vos conteneurs.
Les images de conteneurs sont stockées dans un registre de conteneurs. Chaque image d'un registre est identifiée par une balise. Une balise est appelée
latest. Cette balise est dirigée vers la dernière version de l'image du conteneur de l'application, commeHEADdans un référentiel git. Nous vous recommandons d'utiliser uniquement la baliselatestà des fins de test. Il est recommandé de baliser les images des conteneurs avec une balise unique pour chaque compilation. Nous vous recommandons de baliser vos images en utilisant le git SHA pour la validation git qui a été utilisée pour créer l'image.Vous n'avez pas besoin de créer une image de conteneur pour chaque validation. Toutefois, nous vous recommandons de créer une nouvelle image de conteneur chaque fois que vous publiez une validation de code spécifique dans l'environnement de production. Nous vous recommandons également de baliser l'image avec une balise correspondant à la validation git du code contenu dans l'image. Si vous avez balisé l'image avec la validation git, vous pouvez trouver plus rapidement la version du code exécutée par l'image.
Nous vous recommandons également d'activer les balises d'image immuables dans Amazon Elastic Container Registry. Avec ce paramètre, vous ne pouvez pas modifier l'image du conteneur vers laquelle pointe une balise. Au lieu de cela, Amazon ECR impose qu’une nouvelle image soit téléchargée vers une nouvelle balise. Pour plus d'informations, veuillez consulter Mutabilité d'une étiquette d'image dans le Guide de l'utilisateur Amazon ECR.
Lorsque vous élaborez votre application pour qu’elle s’exécute sur AWS Fargate, vous devez choisir entre déployer plusieurs conteneurs dans la même définition de tâche et déployer les conteneurs séparément dans plusieurs définitions de tâche. Si les conditions suivantes sont requises, nous vous recommandons de déployer plusieurs conteneurs dans une définition de tâche unique :
-
Vos conteneurs partagent le même cycle de vie (autrement dit, ils sont lancés et résiliés conjointement).
-
Vos conteneurs doivent être exécutés sur le même hôte sous-jacent (autrement dit, un conteneur référence l'autre sur un port localhost).
-
Vos conteneurs partagent des ressources.
-
Vos conteneurs partagent des volumes de données.
Si ces conditions suivantes ne sont pas requises, nous vous recommandons de déployer des conteneurs distincts dans plusieurs définitions de tâche. Cela vous permet de mettre à l’échelle, d’allouer et de désallouer les conteneurs séparément.