首页 > 解决方案 > 将多容器部署到 AWS 的最佳方式是什么?

问题描述

我有一个 docker-compose.yaml 可以在本地使用docker compose up命令完美运行。这是文件:

version: "2.2"

services:
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    expose:
      - "6379"
  cubestore:
    image: cubejs/cubestore:latest
    environment:
      - CUBESTORE_REMOTE_DIR=/cube/data
    volumes:
      - .cubestore:/cube/data
  **cubejs-api:**
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 4000:4000
      - 3000:3000
    environment:
      - CUBEJS_CUBESTORE_HOST=localhost
      - CUBEJS_WEB_SOCKETS=true
      - CUBEJS_DB_TYPE=mysql
      - CUBEJS_API_SECRET=adaJHNIKJGHaaKBDDKJ
      - NODE_ENV=production
      - CUBEJS_REDIS_URL=redis://redis:6379
      - DEBUG_LOG=true
      - CUBESTORE_LOG_LEVEL=info
    depends_on:
      - cubestore
      - redis
    links:
      - cubestore
    volumes:
      - .:/cube/conf
      - /cube/conf/node_modules
    working_dir: /cube/conf

cubejs-api是我的主要应用程序,它连接到 redis 和 cubestore 等其他服务。现在,我想将其移至 AWS。

我尝试通过创建 ECS 上下文并运行docker compose up命令来做到这一点,但它失败了,因为它使用 Fargate 作为默认值,并且 Fargate 不支持某些功能。所以我想我必须使用EC2。我尝试的另一种方法是,为 ECR 创建一个图像cubejs-api并推送到 ECR 并在集群下的任务中运行它。它有效,但我无法添加其他依赖项(redis 和 cubestore)。我尝试在任务定义中为它们添加容器以及 cubejs-api 容器,但失败并出现错误。

谁能让我知道最好的方法是什么?

标签: dockeramazon-ec2docker-composeamazon-ecs

解决方案


我在这个组合中没有看到任何不适用于 Fargate 的东西(或者换句话说,我看不出使用 EC2 可以如何让这个组合更容易作为起点)。

我在这个 compose 文件中看到的主要问题是它映射了本地环境中的卷,而这实际上不适用于 compose/ECS。我推测,如果您能够将数据直接烘焙到容器中(并且您将删除此撰写文件中对卷的引用),它将“正常工作”。

如果您想将图像构建为撰写工作流程的一部分,您仍然需要与上下文共舞(请参阅this)。

还有其他的组合替代方案,您可以使用 Dockerfile(s)(例如Copilot)将它们部署到 AWS,但您仍然需要找到一种方法将数据/卷嵌入/烘焙到容器中.


推荐阅读