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

27
我正在尝试使用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镜像的示例,但我只是想使用它来设置环境以运行测试。
已回答:在CodeBuild的环境部分设置Docker镜像
感谢@mferre的回答。无需进行任何特殊操作即可完全支持Docker-compose。关键是在设置AWS CodeBuild控制台内部(或通过API)时,在“环境”部分选择一个Docker镜像:

enter image description here

或者也可以为现有项目指定 - 从“构建/构建项目”中选择项目,然后从“编辑”菜单中选择“环境”。这样可以让您指定镜像:

enter image description here

你可以使用任何其他的镜像并在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提供的node 8.11容器时遇到了相同的错误。 - NickKampe
世界上最伟大的未解之谜 - mahemoff
问题刚刚得到解决。 - mahemoff
@mahemoff 链接到截图不可靠。提供一些能够工作的参考解决方案将会很棒。 - Panade
3个回答

16

好的,我找到了问题所在!

你需要在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!"

我目前正在使用自定义镜像和docker-compose进行相同的操作。然而,docker-compose命令实际上什么也没有发生(即没有控制台输出),我不知道为什么...我还收到以下消息:无法连接到unix:///var/run/docker.sock处的Docker守护程序。 Docker守护程序正在运行吗? - n1ru4l
1
这是 AWS 记录的非“docker”默认容器使用方式,例如提供的代码构建映像,如 nodejs:10.14.1 和 ruby:2.5.3。在此处查看更多信息:https://docs.aws.amazon.com/codebuild/latest/userguide/sample-docker.html - NickKampe
2
请确保在构建过程中使用“特权模式”,否则每次都会收到“无法连接到Docker守护程序”的错误消息。 - NickKampe
1
所以,我已经配置为特权运行,并放置了上述特定的守护进程运行命令,但我仍然收到“守护进程是否正在运行?”的错误。任何帮助都将不胜感激。 - RoflWaffle17
1
你可以尝试运行 which dockerd 命令,它会告诉你 dockerd 的位置。我在 /usr/bin/dockerd 找到了它。 - Tarek N. Elsamni
显示剩余2条评论

9
你是否在使用Docker运行时作为构建环境?
我正在使用这个仓库:https://github.com/mreferre/yelb 那个docker-compose文件并没有构建任何东西(它更适合用于部署),但我认为你遇到的问题比那要早得多。如果你使用Docker运行时,你的compose up应该可以正常工作。
这是我的buildspec的样子:
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。 - mahemoff
抱歉,当我问你是否正在使用Docker运行时时,我指的是你是否已经配置了CodeBuild环境以使用Docker运行时镜像。@NickKampe提到了Node镜像,而你提到了应该安装Docker并启动服务。如果您使用Docker容器,则无需执行任何这些操作,它应该可以直接使用。只是在确认一下。 - mreferre
谢谢。就这些了。有很多配置选项,但现在我看到我必须在CodeBuild的“环境”部分设置它。 - mahemoff

0
镜像 aws/codebuild/standard:7.0 已安装 Docker Compose。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接