Docker 撰写 ECS 错误:资源处理程序返回消息:“模型验证失败(#/Volumes:数组项不唯一)”

Posted

技术标签:

【中文标题】Docker 撰写 ECS 错误:资源处理程序返回消息:“模型验证失败(#/Volumes:数组项不唯一)”【英文标题】:Docker compose up ECS error: Resource handler returned message: "Model validation failed (#/Volumes: array items are not unique)" 【发布时间】:2021-06-29 02:55:55 【问题描述】:

我一直在尝试将我的 Postgres + Backend + Prisma 图像部署到 Amazon ECS,但遇到了这个错误:

资源处理程序返回消息:“模型验证失败(#/Volumes:数组项不唯一)”

我已经坚持了几天,如果有任何帮助,我们将不胜感激。我使用我的 Amazon ECS 上下文运行 docker compose up 来解决此错误。

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:

【问题讨论】:

【参考方案1】:

AWS 容器服务团队成员在这里。我从未见过该错误,但上面的代码中有些地方似乎不正确,导致我无法对其进行测试。

服务应与版本缩进 如果我尝试使用该卷映射启动(在 AWS 中)Postgres,它会吐出 "initdb: error: directory "/var/lib/postgresql/data" exists but is not empty" 错误。即使在 docker 主机(使用docker-compose up)上本地启动 Postgres 也会失败,尽管我没有在那里进一步调查。你有/2 有什么原因吗?这应该有效吗? 您可以通过指定host:container 端口通过负载平衡器公开所有服务。我假设您只想公开prisma 容器?还是我误解了你在做什么?

这是对您的 compose 稍作修改的版本,对我来说似乎工作得很好:

version: '3.4'
services:
  db:
    container_name: db
    image: postgres:latest
    environment:
      - POSTGRES_USER=me
      - POSTGRES_PASSWORD=mypassword
    volumes:
      - my-vol:/var/lib/postgresql/data
  backend:
    depends_on:
      - db
    container_name: backend
    image: nginx
  prisma:
    depends_on:
      - db
    container_name: prisma
    ports:
      - 80:80
    image: nginx
    environment:
      NODE_ENV: production  
volumes:
  my-vol:

请注意,我刚刚使用伪造的 nginx 映像更改了 prisma 和后端容器映像,只是为了提升堆栈(我还必须将端口更改为 80:80)。

【讨论】:

这不是将我的 Prisma 端口暴露给容器的正确方法吗?我希望能够使用端口号 [IP]:[port_number] 访问 IP 地址,这就是我的想法。我还在镜像 Dockerfiles 中使用 EXPOSE 来公开端口,但有些事情告诉我这不是正确的方法。 如果这是您的堆栈端点(即您要公开的服务),您肯定需要为 Prisma 容器调用 ports。这样,“消费者”可以访问 Prisma 容器,Prisma 容器可以在内部与后端容器对话,而后端容器可以与 postgres 对话。但是,如果您也为其他容器定义 ports,它们都将在 LB 上公开暴露(我认为这不是您想要的?)

以上是关于Docker 撰写 ECS 错误:资源处理程序返回消息:“模型验证失败(#/Volumes:数组项不唯一)”的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 AWS CLI 运行 ECS 任务时出现资源:内存错误

在 Docker 后面运行的 Nginx 上出现随机 502/503 错误(在 ECS 集群 + ALB 上)

使用 terraform 的 AWS ECS 容量提供程序

使用 ECS 的 Docker 级别负载均衡

通过 Github 操作在 AWS ECS 上使用 Docker Compose 进行部署

Docker撰写mysql连接失败