簡體   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