如何在 AWS CodeBuild 上运行 docker-compose?

Posted

技术标签:

【中文标题】如何在 AWS CodeBuild 上运行 docker-compose?【英文标题】:How to run docker-compose on AWS CodeBuild? 【发布时间】:2019-03-27 17:06:54 【问题描述】:

我正在尝试使用 docker-compose 在 AWS CodeBuild 上设置自动化 Rails 测试,但它出错了。

在 buildspec.yml 中:

phases:
  build:
    commands:
        - docker-compose up -d

[Container] 2018/10/23 11:27:56 Running command docker-compose up -d
Couldn't connect to Docker daemon at http+docker://localhost - is it running?
 If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
 [Container] 2018/10/23 11:27:56 Command did not exit successfully docker-compose up -d exit status 1
[Container] 2018/10/23 11:27:56 Running command echo This always runs even if the install command fails
This always runs even if the install command fails
 [Container] 2018/10/23 11:27:56 Phase complete: BUILD Success: false
[Container] 2018/10/23 11:27:56 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker-compose up -d. Reason: exit status 1

大概我需要安装 docker 并启动服务,但这将在 Docker 中运行 Docker,并且需要以特权权限启动构建服务器。我只能看到用于构建 Docker 映像的示例,但我只是尝试使用它来设置运行测试的环境。

回答:在 CodeBuild 的环境部分设置 Docker 映像

感谢@mferre 回答这个问题。 Docker-compose 确实是完全支持的,不需要做任何特别的事情。关键是在 AWS CodeBuild 控制台(或通过 API 进行设置)时,在“环境”部分选择一个 Docker 映像:

也可以为现有项目指定 - 从 Build / Build Projects 中选择项目,然后从 Edit 菜单中选择 Environments。这使您可以指定图像:

您可以使用任何其他镜像并在buildspec.yml 中编写 Docker 设置脚本,但最简单的方法是使用上述官方 Docker 镜像。以此为容器,docker 和 docker-compose 已预先安装,因此 docker-compose “正常工作”。如果项目的根目录中有docker-compose.yml 文件,则buildspec.yml 可以像立即运行一样简单:

version: 0.2
phases:
  build:
    commands:
      - docker-compose up -d

【问题讨论】:

你解决过这个问题吗?在这里使用 aws 提供的节点 8.11 容器遇到相同的错误 世界上最大的未解之谜???? ...刚刚解决了???? @mahemoff 屏幕截图链接不可靠。对您的解决方案的一些工作参考会很棒。 【参考方案1】:

好的,我想通了!

您需要在 CodeBuild 容器上启用“特权访问”。这将允许您与 docker cli 交互。

然后将这两行添加到安装命令中:

- nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2& - timeout 15 sh -c "until docker info; do echo .; sleep 1; done" `

例如:

version: 0.2

phases:
  install:
    commands:
      - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2&
      - timeout 15 sh -c "until docker info; do echo .; sleep 1; done"
  pre_build:
    commands:
      - docker build -t helloworld .
  build:
    commands:
      - docker images
      - docker run helloworld echo "Hello, World!"

【讨论】:

这可能有效,但似乎过于复杂。如果您只是在 Codebuild 环境配置中选择 Docker 运行时,它将正常工作。 这是用于非“docker”默认容器的“AWS”记录方式,例如代码构建提供的镜像,如 nodejs:10.14.1 和 ruby​​:2.5.3 阅读更多这里:docs.aws.amazon.com/codebuild/latest/userguide/… 确保您在构建时使用“特权模式”,否则每次都会收到“无法连接到 docker daemon”错误消息。 所以,我已经配置为以特权身份运行,并输入了上面提到的特定守护程序运行命令,但我仍然得到“守护程序正在运行吗?”错误.. 任何帮助表示赞赏。 您可以尝试运行which dockerd,它应该会告诉您您的 dockerd 在哪里。我在/usr/bin/dockerd 找到了它【参考方案2】:

您是否在构建环境中使用 Docker 运行时?

我正在处理这个 repo:https://github.com/mreferre/yelb

dockercompose 并没有构建任何东西(它的目的是部署),但我相信您在此之前就遇到了问题。如果您使用 Docker 运行时,您的组合应该可以工作。

这是我的构建规范的样子:

version: 0.2
phases:
  build:
    commands:
        - cd deployments/platformdeployment/Docker
        - docker-compose up -d

这是输出:

[Container] 2019/02/20 13:48:02 Waiting for agent ping 
[Container] 2019/02/20 13:48:04 Waiting for DOWNLOAD_SOURCE 
[Container] 2019/02/20 13:48:07 Phase is DOWNLOAD_SOURCE 
[Container] 2019/02/20 13:48:07 CODEBUILD_SRC_DIR=/codebuild/output/src292484508/src/github.com/mreferre/yelb 
[Container] 2019/02/20 13:48:07 YAML location is /codebuild/readonly/buildspec.yml 
[Container] 2019/02/20 13:48:07 Processing environment variables 
[Container] 2019/02/20 13:48:07 Moving to directory /codebuild/output/src292484508/src/github.com/mreferre/yelb 
[Container] 2019/02/20 13:48:07 Registering with agent 
[Container] 2019/02/20 13:48:07 Phases found in YAML: 1 
[Container] 2019/02/20 13:48:07  BUILD: 2 commands 
[Container] 2019/02/20 13:48:07 Phase complete: DOWNLOAD_SOURCE Success: true 
[Container] 2019/02/20 13:48:07 Phase context status code:  Message:  
[Container] 2019/02/20 13:48:07 Entering phase INSTALL 
[Container] 2019/02/20 13:48:07 Phase complete: INSTALL Success: true 
[Container] 2019/02/20 13:48:07 Phase context status code:  Message:  
[Container] 2019/02/20 13:48:08 Entering phase PRE_BUILD 
[Container] 2019/02/20 13:48:08 Phase complete: PRE_BUILD Success: true 
[Container] 2019/02/20 13:48:08 Phase context status code:  Message:  
[Container] 2019/02/20 13:48:08 Entering phase BUILD 
[Container] 2019/02/20 13:48:08 Running command cd deployments/platformdeployment/Docker 

[Container] 2019/02/20 13:48:08 Running command docker-compose up -d 
Creating network "docker_yelb-network" with driver "bridge" 
Pulling redis-server (redis:4.0.2)... 
4.0.2: Pulling from library/redis 
Pulling yelb-db (mreferre/yelb-db:0.3)... 
0.3: Pulling from mreferre/yelb-db 
Pulling yelb-appserver (mreferre/yelb-appserver:0.3)... 
0.3: Pulling from mreferre/yelb-appserver 
Pulling yelb-ui (mreferre/yelb-ui:0.3)... 
0.3: Pulling from mreferre/yelb-ui 
Creating docker_redis-server_1 ...  
Creating docker_yelb-db_1      ...  
·[2A·[2K 
Creating docker_redis-server_1 ... ·[32mdone·[0m 
·[2B·[1A·[2K 
Creating docker_yelb-db_1      ... ·[32mdone·[0m 
·[1BCreating docker_yelb-appserver_1 ...  
·[1A·[2K 
Creating docker_yelb-appserver_1 ... ·[32mdone·[0m 
·[1BCreating docker_yelb-ui_1        ...  
·[1A·[2K 
Creating docker_yelb-ui_1        ... ·[32mdone·[0m 
·[1B 
[Container] 2019/02/20 13:49:00 Phase complete: BUILD Success: true 
[Container] 2019/02/20 13:49:00 Phase context status code:  Message:  
[Container] 2019/02/20 13:49:00 Entering phase POST_BUILD 
[Container] 2019/02/20 13:49:00 Phase complete: POST_BUILD Success: true 
[Container] 2019/02/20 13:49:00 Phase context status code:  Message:  


【讨论】:

感谢您的输出,它至少表明它是可能的。是的,也在开发中使用 Docker。 抱歉,当我询问您是否使用 Docker 运行时,我的意思是您是否已将 CodeBuild 环境配置为使用 Docker 运行时映像。 @NickKampe 提到了 Node 映像,您提到应该安装 docker 并启动服务。如果您使用 Docker 容器并且 可以正常工作,那么这些都不是必需的。只是检查。 谢谢。就是这样。有很多配置选项,但现在我看到我必须在 CodeBuild 的“环境”部分进行设置。

以上是关于如何在 AWS CodeBuild 上运行 docker-compose?的主要内容,如果未能解决你的问题,请参考以下文章

Puppeteer 无法在 AWS CodeBuild 上运行 Chrome

ImportError:无法从 AWS CodeBuild 中的“botocore.docs.bcdoc”导入名称“docevents”

Newman:未知编码:在 AWS CodeBuild 上运行 Newman cli 时弹出 latin1

AWS Codebuild:我想用一个项目运行多个存储库

如何使用 Webpack 配置 AWS Codebuild

AWS CodeBuild 不生成构建文件夹 - NodeJS