首页 > 解决方案 > 仅从使用 Docker Compose 部署的 AWS 实例更新一个容器

问题描述

我使用 Docker compose 将 Postgres + Backend + Prisma 实例部署到 Amazon ECS。我有一个关于在不重新部署/删除整个实例的情况下更新图像的问题。

我的图像位于 Amazon ECR - 如果我在 Amazon ECR 端更新图像,是否会更新我的实例?相同的链接仍将用于引用我的图像,所以我想知道是否是这种情况。如果没有,我是否可以只刷新实例上的一个容器?我在下面附上了我的 docker-compose.yml 文件。

version: '3.4'
    services:
      db:
        container_name: db
        ports:
          - 5432:5432
        image: postgres:latest
        environment:
          - POSTGRES_USER=[user]
          - POSTGRES_PASSWORD=[password]
        volumes:
          - my-vol:/var/lib/postgresql/data/2
      backend:
        depends_on:
          - db
        container_name: backend
        ports:
          - 4000:4000
        image: [backend image name]
      prisma:
        depends_on:
          - db
        container_name: prisma
        ports:
          - 5555:5555
        image: [prisma image name]
        environment:
          NODE_ENV: production
    volumes:
      my-vol:

标签: amazon-web-servicesdockeramazon-ec2docker-composeamazon-ecs

解决方案


很高兴你在这方面取得了进展

仅仅更新 ECR 上的图像不会有太大作用,因为 ECS 服务不会轮询新图像。在本机 ECS 中,如果您强制重新部署按原样配置的服务,并且如果您更新容器镜像保持不变name:tag,那么它将使用新镜像重新部署任务。我不知道是否有办法通过 compose 强制重新部署,或者您是否需要以强制重新部署任务的方式调整/欺骗配置。

实现这一点的一种方法是创建一个管道(使用您方便的工具)来监控 ECR 中的更新,并且如果上传了新图像,它将触发服务重新部署。

实现这一点的更好方法是创建一个管道(使用您方便的工具),它执行相同但使用不同的标签。始终为您的部署使用相同的标签并不是最佳实践,因为您永远不知道在任何时间点实际部署了什么。

我们写了一篇博客文章,涵盖了其中一些场景(包括能够构建容器)。如果您已经这样做了,那么博客中的示例不应由新的 GH 提交触发,而是由被推送到 ECR 的新图像触发。

HTH。


推荐阅读