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