J'essaye d'installer la configuration de déploiement d'aws ecs fargate. J'ai pu exécuter des conteneurs sans contrôle de santé des conteneurs. Mais, Je souhaite exécuter des vérifications de l'état des conteneurs aussi. J'ai essayé tous les scénarios possibles pour y parvenir. Mais pas de chance.
j'ai essayé avec les commandes recommandées par aws ci-dessous pour vérifier les contrôles de santé des conteneurs à partir de l'URL indiquée.
J'ai essayé avec les deux commandes ci-dessus. Mais, aucun d'entre eux ne fonctionne comme prévu. Aidez-moi à recevoir des commandes de contrôle de santé valides pour les conteneurs
Ci-dessous mon DockerFile
FROM centos:latest
RUN yum update -y
RUN yum install httpd httpd-tools curl -y
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
HEALTHCHECK CMD curl --fail http://localhost:80/ || exit 1
FROM Microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
FROM Microsoft/dotnet:2.1-sdk AS build
WORKDIR /DockerDemoApi
COPY ./DockerDemoApi.csproj DockerDemoApi/
RUN dotnet restore DockerDemoApi/DockerDemoApi.csproj
COPY . .
WORKDIR /DockerDemoApi
RUN dotnet build DockerDemoApi.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish DockerDemoApi.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DockerDemoApi.dll"]
J'ai ajouté la commande curl à l'intérieur de mon conteneur et son fonctionnement. Mais, si je garde la même commande dans la tâche AWS Healthcheck, son échec.
Définition de tâche JSON:
{
"ipcMode": null,
"executionRoleArn": "arn:aws:iam::xxxx:role/ecsTaskExecutionRole",
"containerDefinitions": [{
"dnsSearchDomains": null,
"logConfiguration": {
"logDriver": "awslogs",
"secretOptions": null,
"options": {
"awslogs-group": "/ecs/mall-health-check-task",
"awslogs-region": "ap-south-1",
"awslogs-stream-prefix": "ecs"
}
},
"entryPoint": [],
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
],
"command": [],
"linuxParameters": null,
"cpu": 256,
"environment": [],
"resourceRequirements": null,
"ulimits": null,
"dnsServers": null,
"mountPoints": [],
"workingDirectory": null,
"secrets": null,
"dockerSecurityOptions": null,
"memory": null,
"memoryReservation": 512,
"volumesFrom": [],
"stopTimeout": null,
"image": "xxxx.dkr.ecr.ap-south-
1.amazonaws.com/autoaml/api/dev/Alpine:latest",
"startTimeout": null,
"dependsOn": null,
"disableNetworking": null,
"interactive": null,
"healthCheck": null,
"essential": true,
"links": [],
"hostname": null,
"extraHosts": null,
"pseudoTerminal": null,
"user": null,
"readonlyRootFilesystem": null,
"dockerLabels": null,
"systemControls": null,
"privileged": null,
"name": "sample-app"
}
],
"placementConstraints": [],
"memory": "512",
"taskRoleArn": "arn:aws:iam::xxxx:role/ecsTaskExecutionRole",
"compatibilities": [
"EC2",
"FARGATE"
],
"taskDefinitionArn": "arn:aws:ecs:ap-south-1:xxx:task-definition/mall-
health-check-task:9",
"family": "mall-health-check-task",
"requiresAttributes": [{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.execution-role-ecr-pull"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.task-eni"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.ecr-auth"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.task-iam-role"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "ecs.capability.execution-role-awslogs"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
},
{
"targetId": null,
"targetType": null,
"value": null,
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
}
],
"pidMode": null,
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"revision": 9,
"status": "ACTIVE",
"proxyConfiguration": null,
"volumes": []
}
L'image docker que vous utilisez, a-t-elle curl
installé une partie du package ?.
D'après votre capture d'écran, il semble que vous utilisiez httpd:2.4
image docker directement. Si tel est le cas, curl
ne fait pas partie du package.
Vous devez créer votre propre image Docker par le haut httpd:2.4
comme base. Voici un exemple de contenu Dockerfile pour obtenir une partie curl de l'image.
Exemple -
FROM httpd:2.4
RUN apt-get update; \
apt-get install -y --no-install-recommends curl;
puis créez l'image et poussez-la sur votre compte dockerhub ou sur votre dépôt Docker privé.
docker build -t my-Apache2 .
docker run -dit --name my-running-app -p 80:80 my-Apache2
Maintenant, avec l'image ci-dessus, vous devriez pouvoir faire fonctionner la commande healthcheck.
https://hub.docker.com/_/httpd
https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile
Le Documentation mentionne ce qui suit:
Lors de l'enregistrement d'une définition de tâche dans AWS Management Console, utilisez une liste de commandes séparées par des virgules qui sera automatiquement convertie en chaîne après la création de la définition de tâche. Un exemple d'entrée pour un bilan de santé pourrait être:
CMD-Shell, curl -f http://localhost/ || exit 1
Lors de l'enregistrement d'une définition de tâche à l'aide du panneau JSON de l'AWS Management Console, de l'AWS CLI ou des API, vous devez placer la liste des commandes entre crochets. Un exemple d'entrée pour un bilan de santé pourrait être:
[ "CMD-Shell", "curl -f http://localhost/ || exit 1" ]
Avez-vous vérifié votre commande de vérification de l'état? Je veux dire, http://127.0.0. est valide, non? Vérifiez que votre conteneur renvoie une réponse de succès lorsque vous appuyez sur http://127.0.0. (sans port).
Voici l'exemple de définition de tâche. Il s'agit de démarrer le serveur Tomcat dans un conteneur et de vérifier l'intégrité (localhost: 8080)
{
"ipcMode": null,
"executionRoleArn": "arn:aws:iam::accountid:role/taskExecutionRole",
"containerDefinitions": [
{
"dnsSearchDomains": null,
"logConfiguration": {
"logDriver": "awslogs",
"secretOptions": null,
"options": {
"awslogs-group": "/test/test-task",
"awslogs-region": "us-east-2",
"awslogs-stream-prefix": "test"
}
},
"entryPoint": null,
"portMappings": [
{
"hostPort": 8080,
"protocol": "tcp",
"containerPort": 8080
}
],
"command": null,
"linuxParameters": null,
"cpu": 0,
"environment": [],
"resourceRequirements": null,
"ulimits": null,
"dnsServers": null,
"mountPoints": [],
"workingDirectory": null,
"secrets": null,
"dockerSecurityOptions": null,
"memory": null,
"memoryReservation": null,
"volumesFrom": [],
"stopTimeout": null,
"image": "Tomcat",
"startTimeout": null,
"dependsOn": null,
"disableNetworking": false,
"interactive": null,
"healthCheck": {
"retries": 3,
"command": [
"CMD-Shell",
"curl -f http://localhost:8080/ || exit 1"
],
"timeout": 5,
"interval": 30,
"startPeriod": null
},
"essential": true,
"links": null,
"hostname": null,
"extraHosts": null,
"pseudoTerminal": null,
"user": null,
"readonlyRootFilesystem": null,
"dockerLabels": null,
"systemControls": null,
"privileged": null,
"name": "Tomcat"
}
],
"memory": "1024",
"taskRoleArn": "arn:aws:iam::accountid:role/taskExecutionRole",
"family": "test-task",
"pidMode": null,
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "512",
"proxyConfiguration": null,
"volumes": []
}
Je ne sais pas pourquoi mais changez http: // localhost par - http://127.0.0.1 (pas seulement 127.0.0.1 ) à utiliser pour corriger problème.
J'ai suivi ce qui a été suggéré ici et cela a résolu mes problèmes de bilan de santé.