繁体   English   中英

AWS ECS 不支持在 docker 组合中部署标签

[英]Deploy labels in docker compose not supported by AWS ECS

我正在尝试将由前端、后端、数据库和 Traefik 反向代理组成的(简单)应用程序堆栈部署到 AWS ECS 中。 一切都放在一个 Docker 组合文件中。

I followed the docs at https://docs.docker.com/cloud/ecs-integration/ and looked up carefully the supported features here: https://docs.docker.com/cloud/ecs-compose-features/ .

一切都在本地顺利进行,包括。 使用标签的 Traefik 配置。 但是,Traefik 无法识别 ECS 中的任何服务(尽管以https://doc.traefik.io/traefik/providers/ecs/中所述的正确角色运行)。 我认为这是因为 ECS 任务中没有定义标签,尽管它们应该得到支持。 当我在 ECS 上下文中运行docker compose up ,我得到

WARNING services.deploy.labels: unsupported attribute

这是撰写文件(有点缩短):

version: "3"

services:
  proxy:
    image: traefik:v2.5
    networks:
      - ${TRAEFIK_PUBLIC_NETWORK?Variable not set}
      - default
    ports:
      - "8080:8080"
      - "80:80"
    command:
      - --providers.ecs=true
      - --providers.ecs.clusters=mycluster
      - --providers.ecs.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`)
      - --providers.ecs.exposedbydefault=false
      - --accesslog
      - --log
      - --log.level=DEBUG
      - --api
    x-aws-role:
      Version: "2012-10-17"
      Statement:
        Effect: "Allow"
        Action:
          - "ecs:ListClusters"
          - "ecs:DescribeClusters"
          - "ecs:ListTasks"
          - "ecs:DescribeTasks"
          - "ecs:DescribeContainerInstances"
          - "ecs:DescribeTaskDefinition"
          - "ec2:DescribeInstances"
        Resource:
          - "*"
    deploy:
      labels:
        - traefik.enable=true
        - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set}
        - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set}
        - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.scheme=https
        - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.permanent=true
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`)
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.entrypoints=http
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`)
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.entrypoints=https
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls=true
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls.certresolver=le
        - traefik.http.services.${STACK_NAME?Variable not set}-proxy.loadbalancer.server.port=80
        - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.regex=^https?://(www.)?(${DOMAIN?Variable not set})/(.*)
        - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.replacement=https://${DOMAIN?Variable not set}/$${3}
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.middlewares=${STACK_NAME?Variable not set}-www-redirect
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.middlewares=${STACK_NAME?Variable not set}-www-redirect,${STACK_NAME?Variable not set}-https-redirect

  db:
    image: postgres:13
    env_file:
      - .env.local
    environment:
      - PGDATA=/var/lib/postgresql/data/pgdata
    ports:
      - "${POSTGRES_PORT-5432}:5432"
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M

  backend:
    image: '${DOCKER_IMAGE_BACKEND?Variable not set}:${TAG-latest}'
    depends_on:
      - db
    env_file:
      - .env.local
    environment:
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
    build:
      context: ./
      dockerfile: backend.dockerfile
      args:
        INSTALL_DEV: ${INSTALL_DEV-"false"}
    ports:
      - "${BACKEND_PORT-8000}:8000"
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M
      labels:
        - traefik.enable=true
        - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
        - traefik.http.routers.${STACK_NAME?Variable not set}-backend-http.rule=PathPrefix(`/api`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`)
        - traefik.http.services.${STACK_NAME?Variable not set}-backend.loadbalancer.server.port=8000

  frontend:
    image: '${DOCKER_IMAGE_FRONTEND?Variable not set}:${TAG-latest}'
    env_file:
      - .env.local
    build:
      context: ./
      dockerfile: frontend.dockerfile
      args:
        FRONTEND_ENV: ${FRONTEND_ENV-production}
    ports:
      - "${FRONTEND_PORT-3000}:3000"
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M
      labels:
        - traefik.enable=true
        - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
        - traefik.http.routers.${STACK_NAME?Variable not set}-frontend-http.rule=PathPrefix(`/`)
        - traefik.http.services.${STACK_NAME?Variable not set}-frontend.loadbalancer.server.port=3000


networks:
  traefik-public:
    external: ${TRAEFIK_PUBLIC_NETWORK_IS_EXTERNAL-true}
    name: "sg-mycluster"

非常感谢任何提示

谢谢雅库布

根据此评论,它必须在服务级别( service.labels )使用,而不是在部署级别( service.deploy.labels )。

所以这应该适合你:

services:
  proxy:
    image: traefik:v2.5
    networks:
      - ${TRAEFIK_PUBLIC_NETWORK?Variable not set}
      - default
    ports:
      - "8080:8080"
      - "80:80"
    command:
      - --providers.ecs=true
      - --providers.ecs.clusters=mycluster
      - --providers.ecs.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`)
      - --providers.ecs.exposedbydefault=false
      - --accesslog
      - --log
      - --log.level=DEBUG
      - --api
    x-aws-role:
      Version: "2012-10-17"
      Statement:
        Effect: "Allow"
        Action:
          - "ecs:ListClusters"
          - "ecs:DescribeClusters"
          - "ecs:ListTasks"
          - "ecs:DescribeTasks"
          - "ecs:DescribeContainerInstances"
          - "ecs:DescribeTaskDefinition"
          - "ec2:DescribeInstances"
        Resource:
          - "*"
    labels:
      - traefik.enable=true
      - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set}
      - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set}
      - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.scheme=https
      - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.permanent=true
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`)
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.entrypoints=http
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`)
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.entrypoints=https
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls=true
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls.certresolver=le
      - traefik.http.services.${STACK_NAME?Variable not set}-proxy.loadbalancer.server.port=80
      - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.regex=^https?://(www.)?(${DOMAIN?Variable not set})/(.*)
      - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.replacement=https://${DOMAIN?Variable not set}/$${3}
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.middlewares=${STACK_NAME?Variable not set}-www-redirect
      - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.middlewares=${STACK_NAME?Variable not set}-www-redirect,${STACK_NAME?Variable not set}-https-redirect

  db:
    image: postgres:13
    env_file:
      - .env.local
    environment:
      - PGDATA=/var/lib/postgresql/data/pgdata
    ports:
      - "${POSTGRES_PORT-5432}:5432"
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M

  backend:
    image: '${DOCKER_IMAGE_BACKEND?Variable not set}:${TAG-latest}'
    depends_on:
      - db
    env_file:
      - .env.local
    environment:
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
    build:
      context: ./
      dockerfile: backend.dockerfile
      args:
        INSTALL_DEV: ${INSTALL_DEV-"false"}
    ports:
      - "${BACKEND_PORT-8000}:8000"
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-backend-http.rule=PathPrefix(`/api`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`)
      - traefik.http.services.${STACK_NAME?Variable not set}-backend.loadbalancer.server.port=8000

  frontend:
    image: '${DOCKER_IMAGE_FRONTEND?Variable not set}:${TAG-latest}'
    env_file:
      - .env.local
    build:
      context: ./
      dockerfile: frontend.dockerfile
      args:
        FRONTEND_ENV: ${FRONTEND_ENV-production}
    ports:
      - "${FRONTEND_PORT-3000}:3000"
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 1024M
    labels:
      - traefik.enable=true
      - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
      - traefik.http.routers.${STACK_NAME?Variable not set}-frontend-http.rule=PathPrefix(`/`)
      - traefik.http.services.${STACK_NAME?Variable not set}-frontend.loadbalancer.server.port=3000


networks:
  traefik-public:
    external: ${TRAEFIK_PUBLIC_NETWORK_IS_EXTERNAL-true}
    name: "sg-mycluster"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM