为何AWS CodePipeline缺Dockerfile及Dockerrun.aws.json?如何指定docker-compose-qa.yml
问题原因
- AWS Elastic Beanstalk的Docker环境自动部署时,默认只会在部署包根目录扫描三类文件:
Dockerfile、Dockerrun.aws.json、默认命名的docker-compose.yml,匹配到其中一种才会继续部署流程。你当前使用自定义命名的docker-compose-qa.yml,不在默认扫描列表中,因此触发缺失配置文件的报错。 - 你手动上传部署时可以主动选择指定
docker-compose-qa.yml作为配置文件,因此可以部署成功,和CodePipeline自动部署的扫描逻辑不同。 - 你已确认S3中的构件包存在该文件,排除了构件打包上传失败的问题。
解决方案
方案1:重命名Compose文件为默认名(操作最简单)
在CodeBuild的buildspec配置中,增加重命名命令,将docker-compose-qa.yml在打包构件前重命名为EB默认识别的docker-compose.yml,修改参考如下:
# buildspec.yml 新增post_build命令 post_build: commands: # 其他构建命令省略 - mv docker-compose-qa.yml docker-compose.yml artifacts: files: - 'docker-compose.yml'
修改后重新运行Pipeline即可,EB会自动识别默认命名的Compose文件完成部署。
方案2:新增Dockerrun.aws.json指定配置文件(适合多环境区分命名的场景)
在项目根目录新增Dockerrun.aws.json文件,明确指定要使用的Compose文件路径,内容如下:
{ "AWSEBDockerrunVersion": "3", "dockerComposeFile": "docker-compose-qa.yml" }
然后将该文件加入CodeBuild的构件打包列表:
artifacts: files: - 'docker-compose-qa.yml' - 'Dockerrun.aws.json'
该方案不需要修改原有Compose文件的命名,适合需要保留不同环境对应不同命名Compose文件的场景。
注意事项
- 确认你的Elastic Beanstalk环境使用的是支持Docker Compose的Amazon Linux 2平台版本,旧的Amazon Linux AMI平台不支持直接读取docker-compose.yml配置,需要使用Dockerrun.aws.json v2版本配置多容器。
- 你Compose文件中使用的
${{ secrets.xxx }}变量需要提前在EB环境属性中配置对应的取值,或者在CodeBuild阶段完成变量值替换后再打包构件,否则部署后会出现镜像拉取失败的问题。
内容的提问来源于stack exchange,提问作者George Wurthmann
相关产品推荐
相关产品推荐

