为啥 AWS CodePipeline 抱怨“Dockerfile”和“Dockerrun.aws.json”?

Posted

技术标签:

【中文标题】为啥 AWS CodePipeline 抱怨“Dockerfile”和“Dockerrun.aws.json”?【英文标题】:Why is AWS CodePipeline complaining about 'Dockerfile' and 'Dockerrun.aws.json'?为什么 AWS CodePipeline 抱怨“Dockerfile”和“Dockerrun.aws.json”? 【发布时间】:2021-12-12 06:45:49 【问题描述】:

我正在为我的应用程序创建 CodePipeline,但 AWS ElasticBeanstalk 的部署过程失败并出现以下错误:

实例部署:“Dockerfile”和“Dockerrun.aws.json”都是 您的源包中缺少。至少包括其中之一。这 部署失败。

完整的消息错误是:

部署已完成,但出现错误:在中止部署期间, 某些实例可能已经部署了新的应用程序版本。到 确保所有实例都运行相同的版本,重新部署 适当的应用程序版本。未能部署应用程序。 对实例 ID 的命令执行不成功 'i-0b8823de2e7376c81'。中止操作。 [实例: i-0b8823de2e7376c81] 实例上的命令失败。返回码:1 输出:引擎执行遇到错误.. 实例 部署失败。有关详细信息,请参阅“eb-engine.log”。实例 部署:“Dockerfile”和“Dockerrun.aws.json”都缺失 你的源包。至少包括其中之一。部署 失败了。

我的环境有 3 个容器,为了部署这个环境,我使用 docker-compose-qa.yml 文件,在 AWS CodeBuild 中我将此文件定义为神器,如下图:

artifacts:
  files:
    - 'docker-compose-qa.yml'

docker-compose-qa.yml

version: '3.8'

services:

    sitr-api:
        image: $ secrets.SITR_API_QA_URI_DOCKER_IMG 
        container_name: sitr-api-qa
        environment:
            - ASPNETCORE_ENVIRONMENT=QA
        ports:
            - "9901:80"
        volumes:
            - "./Host-Logs:/app/App_Data/Logs"

    sitr-app:
        image: $ secrets.SITR_APP_QA_URI_DOCKER_IMG 
        container_name: sitr-app-qa
        ports:
            - "9902:80"
    
    sitr-nginx: 
        image: $ secrets.SITR_NGINX_QA_URI_DOCKER_IMG 
        container_name: sitr-nginx-qa
        depends_on: 
          - sitr-app
          - sitr-api
        ports: 
          - "80:80"

eb-engine.log 错误:

2021/10/26 22:07:27.977004 [ERROR] 执行过程中发生错误 命令 [app-deploy] - [Docker 特定构建应用程序]。停止 运行命令。错误:Dockerfile 和 Dockerrun.aws.json 都是 丢失,中止部署

2021/10/26 22:07:27.977008 [INFO] 执行清理逻辑 2021/10/26 22:07:27.977098 [INFO] CommandService 响应: "status":"FAILURE","api_version":"1.0","re​​sults":["status":"FAILURE","msg":"Engine 执行遇到了 错误。","re​​turncode":1,"events":["msg":"实例部署:两者 您的源代码中缺少“Dockerfile”和“Dockerrun.aws.json” 捆。至少包括其中之一。部署 失败。","timestamp":1635286047,"severity":"ERROR","msg":"Instance 部署失败。有关详细信息,请参阅 'eb-engine.log'.","timestamp":1635286047,"severity":"ERROR"]]

我的 CodeBuild 只需构建一个 dotnet 应用程序angular 应用程序 并为这两个应用程序构建 3 个 docker 容器和 nginx。

如果我手动运行我的 CodeBuild,然后在 AWS EB 中选择我的 docker-compose-qa.yml 文件,则发布已成功应用。

我检查了 AWS S3 存储桶,文件被压缩到工件的文件夹中。

问题是:

为什么 Pipeline 抱怨不存在 'Dockerfile''Dockerrun.aws.json' 文件?如何指定它使用 docker-compose-qa.yml 文件?

【问题讨论】:

遗憾的是,您的问题缺乏细节。您的 EB 平台到底是什么?您是如何定义 CodeBuild 的。不确定 CodeDeploy 与此有什么关系? @Marcin my CodeBuild 只需构建一个 dotnet 应用程序angular 应用程序 并构建 3 个 docker 容器 适用于应用程序和 nginx。我更详细地编辑了问题,但如果我需要完整的 CodeBuild,我可以在问题中发布。 您在 AWS CodeDeploy 中写道“我正在将此文件定义为工件,如下所示”?我想应该是 CodeBuild?此外,您必须将 docker-compose-qa.yml 重命名为 docker-compose.yml 应该叫docker-compose.yml,而不是docker-compose-qa.yml @Marcin 它刚刚完成,它工作是的,它只是文件的名称!如果您可以发布作为答案,我在这里接受! :) 【参考方案1】:

基于 cmets。

问题是由文件名错误引起的。它应该被称为docker-compose.yml,而不是docker-compose-qa.yml。重命名文件解决了这个问题。

【讨论】:

以上是关于为啥 AWS CodePipeline 抱怨“Dockerfile”和“Dockerrun.aws.json”?的主要内容,如果未能解决你的问题,请参考以下文章

AWS CodeBuild + CodePipeline:“找不到匹配的工件路径”

AWS CodePipeline - 使用现有 Dockerrun.aws.json 部署到 Elastic Beanstalk

如何停止 aws codepipeline 部署阶段

[AWS DA] AWS CICD: CodeCommit, CodePipeline, CodeBuild, CodeDeploy

使用 AWS CDK 在 AWS Codepipeline 中部署 Python Lambda 函数

AWS CodePipeline:同时运行多个管道