任务定义中不存在容器

Gia*_*eri 5 amazon-web-services amazon-ecs aws-cli

在我的 CI 上,我已经通过 bash 脚本在 AWS ECS 环境中配置了部署

**deploy.sh**
[...]

aws ecs register-task-definition --cli-input-json file://./deploy/skeleton.json

TASK_DEFINITION_ARN=$(aws ecs --output text list-task-definitions --family-prefix "${PROJECT_NAME}" --sort DESC --query "taskDefinitionArns[0]")

aws ecs update-service \
    --cluster "${PROJECT_NAME}" \
    --service "${PROJECT_NAME}" \
    --task-definition "${TASK_DEFINITION_ARN}" \
    --force-new-deployment \
    --deployment-configuration "maximumPercent=200,minimumHealthyPercent=100" \
    --desired-count ${DESIRED_COUNT}

[...]
Run Code Online (Sandbox Code Playgroud)

    **skeleton.json**
{
    "family": "backend",
    "executionRoleArn": "arn:aws:iam::000000000000:role/XXXX",
    "taskRoleArn": "arn:aws:iam::0000000:role/XXXX",
    "networkMode": "awsvpc",
    "containerDefinitions":
        [{
            "name": "csharp",
            "essential": true,
            "environment":[{
                "name" : "CONNECTIONSTRINGS__Redis",
                "value" : "XXXX"
                },
                {
                "name" : "CONNECTIONSTRINGS__Database",
                "value" : "XXX"
                },
                {
                "name" : "ASPNETCORE_ENVIRONMENT",
                "value" : "XXX"
                }],
            "image": "00000000.dkr.ecr.eu-west-1.amazonaws.com/prj/backend:643105ef",
            "portMappings": [
                {
                    "containerPort": 80,
                    "protocol": "tcp"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/backend/",
                    "awslogs-region": "eu-west-1",
                    "awslogs-stream-prefix": "csharp"
                }
            }
        }],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "256",
    "memory": "512"
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用更新服务进行部署时,cli 的回答是:

An error occurred (InvalidParameterException) when calling the UpdateService operation: The container backend does not exist in the task definition.
Run Code Online (Sandbox Code Playgroud)

但是如果我在 json 中将容器名称从csharp更改为backend,则部署工作。

这是一个错误吗?谢谢

Gau*_*rma 43

您在task_definition 中定义的容器name必须与ecs_service 的load_balancer 配置container_name 中的容器匹配。这将允许负载均衡器动态映射容器端口并将其附加到目标组。 在此输入图像描述 在此输入图像描述

  • 这有帮助谢谢。我的问题是,在复制 HowTo 时,task_definition 中的 family_name 和 container_definations 名称相同,并且服务 container_name 引用了 family 名称(我已更改) (2认同)

Yas*_*har 12

我回答这个老问题是为了向 Google 员工指出一些注意事项。

似乎有两个问题与此错误消息相关。

第一个是错误本身是误导的,因为其背后的原因与任务定义没有直接关系,实际上这是负载均衡器(LB)抱怨容器名称,它试图在任务定义中查找。

作为问题本身,在创建 LB 时,containerName作为 prop 传递,在大多数情况下,它是第一个任务定义修订版上的容器名称之一。通过创建新的任务修订来更改创建 LB 时使用的容器名称可能会导致此错误

在这种情况下,重新创建服务和/或任务定义可能会解决问题。


gue*_*los 6

ECS 允许您在一个容器内定义多个容器task definition,因此 ELB 需要知道将流量定向到哪个容器,为此,它会存储您在创建过程中设置的容器的名称。

在此输入图像描述

如果您收到此错误,则您可能没有包含具有相同内容的容器Container Name,因此它抱怨不知道要在新任务定义中连接到什么。

长话短说

name将内部的容器重命名task definition为与当前运行(或上次成功部署)任务定义中定义的容器相同。

在此输入图像描述