首页 > 解决方案 > 我将如何防止类似多米诺骨牌的 STOPPED 任务效果,这是一个好主意吗?

问题描述

ecs-cli compose --file <...> --project-name <...> --aws-profile <...> service up --create-log-groups --cluster <...> --launch-type FARGATE --region eu-west-1当我使用某些任务启动 AWS ECS 任务定义修订版时,会从 aPENDING变为RUNNINGstate。问题是,如果一个容器进入某种STOPPED状态,其余容器似乎会自动进入类似STOPPED状态。有没有办法防止这种情况并且只有特定的容器独立崩溃,或者这是一种“反模式”?

让所有容器同时崩溃会使调试更加困难。

这是为 Dockerfile 提供的ecs-cli compose service up

services:
  ...-file-api:
    environment:
      ...     
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-file-api
    ports:
      - 3054:3054
    restart: always
  ...-frontend:
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-frontend
    ports:
      - 80:80
    restart: always
  ...-help-api:
    environment:
      ...
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-help-api
    ports:
      - 3059:3059
    restart: always
  ...-login-api:
    environment:
      ...
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-login-api
    ports:
      - 3055:3055
    restart: always
  ...-login-frontend:
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-login-frontend
    ports:
      - 8080:8080
    restart: always
  ...-mail-api:
    environment:
      ...
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-mail-api
    ports:
      - 3063:3063
    restart: always
  ...-main-api:
    environment:
      ...
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-main-api
    ports:
      - 3053:3053
    restart: always
  ...-mongo:
    image: mongo:3.4.20-xenial
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-mongo
    restart: always
  ...-plan-api:
    environment:
      ...
    image: ...
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-plan-api
    ports:
      - 3058:3058
    restart: always
  ...-redis:
    image: redis:4.0.14-alpine
    logging:
      driver: awslogs
      options:
        awslogs-group: /ecs/log
        awslogs-region: eu-west-1
        awslogs-stream-prefix: ...-redis
    restart: always
version: '3'

作为“崩溃”的示例,...-main-api服务会得到一个Error: Redis connection to localhost:6379 failed - connect ECONNREFUSEDCloudWatch -> Logs -> Insights. 例如...-mongo,另一个服务的日志不可用,但它仍然适应STOPPED状态。

预期:剩余的容器不应STOPPED由于一个或多个其他容器停止而立即进入状态。STOPPED只有当它们独立崩溃时,它们才应该进入一个状态。

目前:无论如何,所有容器显然都停止了。

标签: amazon-ecsaws-fargate

解决方案


您可以尝试在任务定义中设置一个名为essentialas的参数false,并且应该这样做。

任务定义参数

基本的

类型:布尔值

必填:否

如果容器的基本参数被标记为 true,并且该容器因任何原因失败或停止,则作为任务一部分的所有其他容器都将停止。如果容器的基本参数被标记为 false,那么它的失败不会影响任务中的其余容器。如果省略此参数,则假定容器是必需的。

所有任务必须至少有一个基本容器。如果您的应用程序由多个容器组成,则应将用于共同目的的容器分组为组件,并将不同的组件分成多个任务定义。有关详细信息,请参阅应用程序架构。

“基本”:真|假


推荐阅读