首页 > 解决方案 > docker-compose 在 ECS 上运行

问题描述

我一直在尝试将 Redash 设置为在 ECS 上运行。总的来说,我对 ECS 和 Docker 还很陌生,所以我不确定我到目前为止所做的工作是否缺少一些基本的东西。

到目前为止,我已经将Redash 的 docker-compose 文件转换为 AWS 容器定义。

但是,根据 Redash 文档,我需要先运行docker-compose run --rm server create_db以在 Postgres 容器中设置表。

如何docker-compose run在 ECS 上下文中实现此行为?

我注意到尝试通过向setup-postgres我的容器定义中添加容器来强制执行此行为是可行的,但这是一种技巧,并不理想。

[
  {
    "name": "postgres-setup",
    "image": "redash/redash:latest",
    "cpu": 100,
    "memory": 150,
    "links": [
      "postgres",
      "redis"
    ],
    "command": [
        "create_db"
    ],
    "environment": [
      {
        "name": "PYTHONUNBUFFERED",
        "value": "0"
      },
      {
        "name": "REDASH_LOG_LEVEL",
        "value": "INFO"
      },
      {
        "name": "REDASH_REDIS_URL",
        "value": "redis://redis:6379/0"
      },
      {
        "name": "REDASH_DATABASE_URL",
        "value": "postgresql://postgres@postgres/postgres"
      },
      {
        "name": "REDASH_COOKIE_SECRET",
        "value": "veryverysecret"
      },
      {
        "name": "REDASH_WEB_WORKERS",
        "value": "1"
      }
    ],
    "essential": false
  },
  {
    "name": "nginx",
    "image": "redash/nginx:latest",
    "essential": false,
    "cpu": 100,
    "memory": 200,
    "links": [
      "server:redash"
    ],
    "portMappings": [
      {
        "containerPort": 80,
        "hostPort": 80
      }
    ]
  },
  {
    "name": "postgres",
    "image": "postgres:9.5.6-alpine",
    "essential": true,
    "cpu": 100,
    "memory": 300,
    "mountPoints": [
      {
        "sourceVolume": "mytestvol",
        "containerPath": "/var/lib/postgresql/data"
      }
    ]
  },
  {
    "name": "redis",
    "image": "redis:3.0-alpine",
    "essential": true,
    "cpu": 100,
    "memory": 400
  },
  {
    "name": "server",
    "image": "redash/redash:latest",
    "cpu": 100,
    "memory": 400,
    "links": [
      "postgres",
      "redis"
    ],
    "command": [
        "server"
    ],
    "environment": [
      {
        "name": "PYTHONUNBUFFERED",
        "value": "0"
      },
      {
        "name": "REDASH_LOG_LEVEL",
        "value": "INFO"
      },
      {
        "name": "REDASH_REDIS_URL",
        "value": "redis://redis:6379/0"
      },
      {
        "name": "REDASH_DATABASE_URL",
        "value": "postgresql://postgres@postgres/postgres"
      },
      {
        "name": "REDASH_COOKIE_SECRET",
        "value": "veryverysecret"
      },
      {
        "name": "REDASH_WEB_WORKERS",
        "value": "1"
      }
    ],
    "essential": false,
    "portMappings": [
      {
        "containerPort": 5000,
        "hostPort": 5000
      }
    ]
  },
  {
    "name": "worker",
    "image": "redash/redash:latest",
    "cpu": 100,
    "memory": 400,
    "links": [
      "postgres",
      "redis"
    ],
    "command": [
      "scheduler"
    ],
    "environment": [
      {
        "name": "PYTHONUNBUFFERED",
        "value": "0"
      },
      {
        "name": "REDASH_LOG_LEVEL",
        "value": "INFO"
      },
      {
        "name": "REDASH_REDIS_URL",
        "value": "redis://redis:6379/0"
      },
      {
        "name": "REDASH_DATABASE_URL",
        "value": "postgresql://postgres@postgres/postgres"
      },
      {
        "name": "QUEUES",
        "value": "queries,scheduled_queries,celery"
      },
      {
        "name": "WORKERS_COUNT",
        "value": "1"
      }
    ],
    "essential": false
  }
]

我知道在这样的容器中运行 Postgres 并不理想,以后可能会将其移动到 RDS 中。如果我决定这样做,数据库初始化步骤会是什么样子?创建 ECS 实例,下载docker-compose.yml文件并运行docker-compose run --rm server create_db以在启动 ECS 服务之前进行一次性设置?

标签: dockerdocker-composeamazon-ecsredash

解决方案


你没有。

你在这里看到了这几个错误的方式:

1) Docker Compose 是一个开发工具,而不是生产工具。您可以在生产环境中使用compose 文件——但这将通过 Docker Swarm 使用,并且某些功能仅适用于 docker-compose,而其他功能仅适用于 Docker Swarm。

2) 话虽如此 - ECS 是一个协调器,这就是 Docker Swarm 是什么(这就是你想要的) - 所以在 ECS 上运行 Docker Swarm 完全没有实际意义。

您在这里要做的是创建一个 ECS 任务定义;这本质上是撰写文件的 ECS 版本。您设置映像、端口绑定、卷、容器链接等。

因此,您可以在这里选择是要在 ECS 中运行,还是要设置 Docker Swarm。

祝你好运!


推荐阅读