[英]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.