web-dev-qa-db-ja.com

AWS CodeBuildでdocker-composeを実行するには?

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イメージを選択することです。

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
12
mahemoff

ビルド環境にDockerランタイムを使用していますか?

私はこのレポで作業しています:https://github.com/mreferre/yelb

そのdockercomposeは何も構築していません(むしろデプロイすることを意図しています)が、それよりずっと前に問題に直面していると思います。 Dockerランタイムを使用している場合、作成は機能するはずです。

これは私の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:  


2
mreferre

さて、私は問題を理解しました!

CodeBuildコンテナで「特権アクセス」を有効にする必要があります。これにより、docker cliを操作できます。

次に、インストールコマンドに次の2行を追加します。

- 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!"
6
NickKampe