Команда AWS ECS Fargate Container Healthcheck

Я пытаюсь настроить конфигурацию развертывания aws ecs fargate. Мне удалось запустить контейнеры без проверки их работоспособности. Но я тоже хочу выполнить проверку работоспособности контейнера. Я перепробовал все возможные сценарии, чтобы добиться этого. Но не повезло.

Команда проверки работоспособности контейнера

Я попытался с помощью следующих команд, рекомендованных aws, проверить проверки работоспособности контейнера по указанному URL-адресу.

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_healthcheck

  1. ["CMD-SHELL", "curl -f http://localhost/ || выход 1"]
  2. ["CMD-SHELL" "curl -f 127.0.0.1 || выход 1"]

Я пробовал использовать обе команды выше. Но ни один из них не работает должным образом. Пожалуйста, помогите мне получить действительные команды проверки работоспособности контейнера

Ниже мой 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"]

Я добавил команду curl в свой контейнер и работал. Но если я сохраню ту же команду в задаче AWS Healthcheck, это не удастся.

Определение задачи 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": []
     }

person Arjun    schedule 15.06.2019    source источник
comment
Ваша проверка здоровья не проходит или Fargate выдает ошибку?   -  person Haran    schedule 17.06.2019
comment
да. Состояние здоровья всегда отображается как НЕИЗВЕСТНО.   -  person Arjun    schedule 17.06.2019
comment
Я не вижу каких-либо проблем с передаваемой вами командой, если только не возникает проблем с работоспособностью контейнера. Еще одна информация, вы отметили свой контейнер как 'essential = true   -  person Haran    schedule 17.06.2019
comment
я не добавил, что существенное = истинное @Haran. Но что это будет делать?   -  person Arjun    schedule 17.06.2019
comment
Я добавил essential = true, и все равно он показывает то же самое   -  person Arjun    schedule 17.06.2019
comment
если вы не укажете важный флаг, по умолчанию AWS считает его важным контейнером. Оставив эту часть, как вы определяете определение задачи? через консоль, интерфейс командной строки или API. Если вы используете консоль, попробуйте указать что-то вроде CMD-SHELL, curl -f localhost: 8080 || выход 1, т.е. без квадратных скобок.   -  person Haran    schedule 17.06.2019
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Arjun    schedule 17.06.2019
comment
что именно делает ваш контейнер? эта команда curl действительно работает только в том случае, если вы размещаете среду http на своем изображении, что именно делает ваше изображение?   -  person JD D    schedule 18.06.2019
comment
этот контейнер представляет собой веб-приложение @JDD. Пожалуйста, загляните в мой файл докеров для получения дополнительной информации   -  person Arjun    schedule 18.06.2019
comment
@Arjun, не могли бы вы мне помочь с тем, как вы могли запускать контейнеры без проверки работоспособности. Я тоже пытаюсь сделать то же самое, но m Task остается в режиме PROVISION, а затем терпит неудачу. Мой контейнер не является веб-приложением, это код Python, прослушивающий SQS   -  person Gautam Naik    schedule 12.06.2021


Ответы (3)


В документации упоминается следующее:

При регистрации определения задачи в Консоли управления AWS используйте список команд, разделенных запятыми, который автоматически преобразуется в строку после создания определения задачи. Пример ввода для проверки работоспособности может быть:

CMD-SHELL, curl -f http://localhost/ || exit 1

При регистрации определения задачи с помощью панели JSON Консоли управления AWS, интерфейса командной строки AWS или API следует заключить список команд в скобки. Пример ввода для проверки работоспособности может быть:

[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]

введите описание изображения здесь

Вы проверили свою команду проверки работоспособности? Я имею в виду, что http://127.0.0.0 действительно, верно? Убедитесь, что ваш контейнер возвращает успешный ответ, когда вы нажимаете http://127.0.0.0 (без порта).

Ниже приведен пример определения задачи. Это нужно для запуска сервера tomcat в контейнере и проверки работоспособности (localhost: 8080)

  1. Измените определение задачи в соответствии с потребностями (например, Role Arn)
  2. Создайте службу ECS и сопоставьте определение задачи.
  3. Создайте настроенную группу журналов.
  4. Запустите службу ECS, и ваша задача должна отображаться как работоспособная.
{
  "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": []
}
person Haran    schedule 17.06.2019
comment
Я тоже пробовал это @Haran, прежде чем опубликовать этот вопрос. Без изменений на выходе. Если возможно, если у вас есть рабочий пример, поделитесь, я попробую - person Arjun; 17.06.2019
comment
добавлен пример определения задачи. - person Haran; 18.06.2019
comment
Я добавил свой файл докеров. Не могли бы вы выяснить, есть ли ошибки в определении для проверки здоровья? - person Arjun; 18.06.2019
comment
Что касается Healthcheck, поскольку вы передаете cmd в определении задачи, он переопределит проверку работоспособности файла Docker, ECS запустит контейнер примерно так: docker run -d --health-cmd = 'curl localhost: 8080 || exit 1 '--health-interval = 5s --health-timeout = 3s tomcat. Поделитесь, пожалуйста, определением вашей задачи json. Сначала проверьте, работает ли ваша проверка работоспособности в локальной среде Docker, а затем попробуйте в ECS-Fargate. - person Haran; 18.06.2019
comment
Я добавил определение своей задачи json. Пожалуйста, посмотрите @Haran. К вашему сведению, я удалил команду проверки работоспособности из своего определения задачи с момента ее сбоя. - person Arjun; 18.06.2019
comment
В некоторых случаях. Я не знаю, почему (в контейнере правильно настроен файл / etc / hosts), измените localhost на 127.0.0.1, чтобы решить проблему. - person Garry Dias; 11.12.2019

Используемый вами образ докера имеет curl установленную часть пакета ?.

Судя по вашему снимку экрана, похоже, что вы напрямую используете httpd:2.4 образ докера. Если да, то curl не является частью пакета.

Вам нужно создать свой собственный образ докера сверху httpd:2.4 в качестве основы. Ниже приведен образец содержимого файла Dockerfile для получения завитой части изображения.

Пример -

FROM httpd:2.4
RUN apt-get update; \
    apt-get install -y --no-install-recommends curl;

затем создайте образ и отправьте его в свою учетную запись dockerhub или частное репозиторий докеров.

docker build -t my-apache2 .
docker run -dit --name my-running-app -p 80:80 my-apache2

Теперь с приведенным выше изображением вы сможете запустить команду проверки работоспособности.

https://hub.docker.com/_/httpd

https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile

person Imran    schedule 17.06.2019
comment
да @Imran. Я установил curl как часть пакета. К вашему сведению - пожалуйста, найдите приведенный ниже код. FROM centos:latest RUN yum update -y RUN yum install httpd httpd-tools curl -y EXPOSE 80 Проблема остается прежней. - person Arjun; 17.06.2019
comment
@Arjun, можешь ли ты отредактировать вопрос, указав полную информацию о своем Dockerfile. В приведенном выше коде в комментарии отсутствуют ENTRYPOINT сведения, поэтому я не уверен, правильно ли вы раскручиваете службу !. - person Imran; 17.06.2019
comment
Я добавил свой DockerFile. Пожалуйста, дай мне знать - person Arjun; 18.06.2019

Я не знаю почему, но измените http://localhost на http://127.0.0.1 (не только 127.0.0.1) используйте для устранения проблемы .

Я следил за тем, что предлагалось здесь, и это исправило мою проблемы с проверкой работоспособности.

person Garry Dias    schedule 11.12.2019