在AWS ECS Fargate部署FastAPI+PostgreSQL遇容器无日志退出问题
在AWS ECS Fargate部署FastAPI+PostgreSQL应用遇容器立即退出问题
我尝试通过Docker Compose在AWS ECS Fargate上部署FastAPI + PostgreSQL应用时,容器启动后立即停止,退出码为0(无错误),且CloudWatch未生成任何日志。
本地环境中,Docker化的FastAPI和PostgreSQL运行正常,但加载HuggingFace的ColPali模型需约8分钟才能启动API端点。我已配置ecsTaskExecutionRole策略、s3:GetObject权限及ECR访问权限,此前曾成功部署无额外依赖的简单FastAPI应用。
操作步骤:
- 使用AWS CLI创建仓库、构建、标记并推送Docker镜像;
- 创建默认配置的集群;
- 创建任务定义,任务角色为ecsTaskExecutionRole,采用Linux/ARM64架构(Mac M2芯片),通过S3加载环境变量;
- 在集群中以默认配置运行新任务。
目前已无调试思路,寻求帮助。
更新内容
任务定义JSON
{ "taskDefinitionArn": "arn:aws:ecs:us-west-2:<>:task-definition/colpali-search:1", "containerDefinitions": [ { "name": "colpali-search-api", "image": "<>.dkr.ecr.us-west-2.amazonaws.com/colpali-search:latest", "cpu": 0, "portMappings": [ { "name": "colpali-search-port", "containerPort": 8000, "hostPort": 8000, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "environment": [], "environmentFiles": [ { "value": "arn:aws:s3:::colpali-search-bucket/.env", "type": "s3" } ], "mountPoints": [], "volumesFrom": [], "ulimits": [], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/colpali-search", "mode": "non-blocking", "awslogs-create-group": "true", "max-buffer-size": "25m", "awslogs-region": "us-west-2", "awslogs-stream-prefix": "ecs" }, "secretOptions": [] }, "systemControls": [] } ], "family": "colpali-search", "executionRoleArn": "arn:aws:iam::<>:role/ecsTaskExecutionRole", "networkMode": "awsvpc", "revision": 1, "volumes": [], "status": "ACTIVE", "requiresAttributes": [ { "name": "com.amazonaws.ecs.capability.logging-driver.awslogs" }, { "name": "ecs.capability.execution-role-awslogs" }, { "name": "com.amazonaws.ecs.capability.ecr-auth" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.28" }, { "name": "ecs.capability.env-files.s3" }, { "name": "ecs.capability.execution-role-ecr-pull" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18" }, { "name": "ecs.capability.task-eni" }, { "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29" } ], "placementConstraints": [], "compatibilities": [ "EC2", "FARGATE" ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "1024", "memory": "3072", "runtimePlatform": { "cpuArchitecture": "ARM64", "operatingSystemFamily": "LINUX" }, "registeredAt": "2024-12-03T18:09:53.720Z", "registeredBy": "", "tags": [] }
docker-compose.yml
services: fastapi: build: . container_name: colpali-search depends_on: db: condition: service_healthy networks: - app-network volumes: - ./:/code:ro env_file: - .env environment: - DATABASE_URL=${DATABASE_URL} - PYTHONPATH=/code ports: - '8000:8000' command: > sh -c "alembic upgrade head && fastapi run app.py --port 8000 --workers 4" db: image: pgvector/pgvector:pg17 restart: always volumes: - postgres_data:/var/lib/postgresql/data/ - ./init.sql:/docker-entrypoint-initdb.d/init.sql ports: - 5432:5432 networks: - app-network env_file: - .env environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} entrypoint: sh -c "chmod 644 /docker-entrypoint-initdb.d/init.sql && docker-entrypoint.sh postgres" healthcheck: test: [ 'CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}', ] interval: 5s timeout: 5s retries: 5 networks: app-network: volumes: postgres_data:
Dockerfile
FROM python:3.12-slim as base RUN apt-get update && apt-get install -y poppler-utils && rm -rf /var/lib/apt/lists/* ENV POETRY_VERSION=1.6.1 \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=off \ PIP_DISABLE_PIP_VERSION_CHECK=on \ PIP_DEFAULT_TIMEOUT=100 \ POETRY_HOME="/opt/poetry" \ POETRY_VIRTUALENVS_IN_PROJECT=true \ POETRY_NO_INTERACTION=1 \ PYSETUP_PATH="/opt/pysetup" \ VENV_PATH="/opt/pysetup/.venv" ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH" FROM base as builder RUN --mount=type=cache,target=/root/.cache \ pip install "poetry==$POETRY_VERSION" WORKDIR $PYSETUP_PATH COPY ./poetry.lock ./pyproject.toml ./ RUN --mount=type=cache,target=$POETRY_HOME/pypoetry/cache \ poetry install --no-dev FROM base as production ENV FASTAPI_ENV=production COPY --from=builder $VENV_PATH $VENV_PATH COPY ./colpali_search /colpali_search COPY .env /colpali_search/ COPY alembic.ini /colpali_search/ COPY alembic /colpali_search/alembic WORKDIR /colpali_search EXPOSE 8000
内容的提问来源于Stack Exchange,提问作者CuriousCat
相关产品推荐
相关产品推荐

