Docker-Compose部署AWS Fargate时双容器执行命令异常
解决AWS Fargate容器命令执行错误的问题
问题本质
你的Dockerfile里全局定义了CMD ["python","server.py"],但在docker-compose.yml里给worker容器用command字段覆盖了这个命令,所以本地和CodeBuild里跑docker-compose up时,两个容器能各司其职。但把镜像推去ECR后,Fargate任务没给worker容器指定自定义命令,导致它执行镜像默认的CMD,直接跑server.py引发端口冲突。另外,docker-compose up不加-d会让容器前台运行,CodeBuild进程被卡死,没法继续推送镜像。
解决办法
办法1:给worker单独做镜像
- 给worker写个独立的Dockerfile(比如叫
Dockerfile.worker),把里面的CMD改成["python","worker.py"] - 在
docker-compose.yml里指定worker用这个Dockerfile构建:services: server: build: . ports: - "80:80" worker: build: context: . dockerfile: Dockerfile.worker - CodeBuild里照旧用
docker-compose up --build -d构建,之后分别把两个镜像推去ECR - Fargate任务定义直接用对应的镜像就行,不用额外改命令
办法2:在Fargate任务定义里改worker的命令
- 保持现有单Dockerfile和docker-compose配置不变,构建完镜像推去ECR
- 去AWS ECS控制台改Fargate任务定义:找到worker容器的配置,在「命令」栏填
["python", "worker.py"] - 这样Fargate启动worker时会忽略镜像默认的CMD,执行你指定的命令
办法3:调整CodeBuild的构建流程
要是不想改镜像或任务定义,就调整CodeBuild的步骤:
- 用
docker-compose up --build -d构建并后台启动容器,先验证容器能正常跑 - 执行
docker-compose down把容器停掉(避免CodeBuild环境留垃圾) - 再把构建好的镜像推去ECR
- 这样既不会因为容器前台运行卡住构建,又能确保镜像没问题
重要提醒
docker-compose里的command只是运行时临时覆盖,不会改镜像本身的默认CMD,所以推去ECR的镜像还是保留Dockerfile里的命令- Fargate的优先级:容器级别的命令覆盖 > 镜像自带的CMD
内容的提问来源于stack exchange,提问作者Hamish Robertson
相关产品推荐
相关产品推荐

