【问题标题】:docker-compose run on ECSdocker-compose 在 ECS 上运行
【发布时间】:2023-07-06 15:34:01
【问题描述】:

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

到目前为止,我已将 Redash's docker-compose file 转换为 AWS 容器定义。

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

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

我注意到,尝试通过在我的容器定义中添加 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服务?

【问题讨论】:

    标签: docker docker-compose amazon-ecs redash


    【解决方案1】:

    你没有。

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

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

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

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

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

    祝你好运!

    【讨论】:

    • 我需要阅读和试验更多内容才能真正理解这些概念,但我已经创建了一个任务定义(当我提到我将撰写文件转换为容器定义时暗示)。我面临的问题是试图在任务定义中模仿初始化命令docker-compose run --rm server create_db。我认为在构建postgres 映像时初始化数据库对我来说是理想的,但问题是Redash 正在使用server docker 服务来初始化postgres 映像。
    最近更新 更多