如何使用 AWS ECS 启用 tty 并运行交互式控制台?

Posted

技术标签:

【中文标题】如何使用 AWS ECS 启用 tty 并运行交互式控制台?【英文标题】:How to enable tty and run interactive console with AWS ECS? 【发布时间】:2018-05-13 00:34:53 【问题描述】:

使用 AWS ECS 服务在 EC2 实例上部署 Dockerized Rails 应用程序。我正在使用ecs-cli 部署rails 应用程序,该应用程序使用docker-compose.yml 文件将容器部署为类似于docker-compose 模式的服务。为了为我的应用程序运行交互式 shell,例如 rails console,我创建了一个具有以下定义的单独服务:

version: '2'

volumes: 
  app-tmp:
    driver: local
  app-logs:
    driver: local

services:
  console:
    image: acc-name.dkr.ecr.us-east-1.amazonaws.com/docker_image_name:latest
    command: bundle exec rails c
    hostname: console
    mem_limit: 314572800
    env_file: ../.prod-env
    tty: true
    stdin_open: true
    ports: []
    volumes:
      - "app-logs:/home/app/log"
      - "app-tmp:/home/app/tmp"

但是当我使用以下命令部署任务时:

ecs-cli compose -f docker/docker-compose-console.yml --project-name app-console run console "bundle exec rails c"

标志 tty: truestdin_open: true 被忽略。由于该任务运行控制台启动,更改为 RUNNING 状态,然后以状态 0 静默关闭。

有什么方法可以运行交互式控制台会话或跟踪日志?使用什么方法来实现类似的行为?

TL;DR:我希望通过 AWS ECS 服务获得类似于 docker-compose run app rails c 的行为。

【问题讨论】:

你找到解决这个问题的方法了吗? 【参考方案1】:

在任务配置中单击Configure via JSON 按钮。 将 pseudoTerminal 属性更改为 true"pseudoTerminal": true

【讨论】:

那么你如何实际连接到实例? 遗憾的是,您实际上无法连接到分配的伪终端。如果没有这些选项,如果您的容器需要分配终端会话,它将无法并且会立即停止。启用这些选项后,容器将继续运行指定的任何进程,但您无法连接到它。文档对此根本不是很清楚。【参考方案2】:

目前无法启动 ECS 任务并连接到由启动命令创建的分配的 TTY 会话。似乎有两种选择可以做到这一点......

    使用几乎所有可以保持容器运行的命令正常启动 ECS 任务。然后找到任务被分配到的实例并通过 SSH 连接到该主机并使用 docker exec 启动您的控制台。这种方法的缺点是当您结束会话时容器不会退出。完成后您必须手动结束任务。

    在其他地方运行容器。如果您的本地网络可以访问容器所需的所有资源,您可以在本地运行容器。否则,您可以使用 EC2 实例在 VPC 中运行容器。

【讨论】:

以上是关于如何使用 AWS ECS 启用 tty 并运行交互式控制台?的主要内容,如果未能解决你的问题,请参考以下文章

如何链接在 AWS ECS 任务中运行的 2 个容器

如何使用 Fargate 在 AWS ECS 中正在运行的容器中运行命令

Docker 在 AWS ECS 中运行

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除

如何在节点 AWS 开发工具包代码中使用 AWS ECS 任务角色