Screaming Loud

日々是精進

CircleCI上でdockerの上でdockerを動かす

AWS ECRのイメージ上でCIを実行したかったからこんなことをしてた。

CirclCI 2.1の機能を一部つかってます。

commands定義

railsのbundle install を実行する例 adminというディレクトリにrailsのファイルを入れている想定

commands:
  build_on_docker:
    parameters:
      env: 
        type: string
    steps:
      - setup_remote_docker 
      - run: |
          Image={accountID}.dkr.ecr.ap-northeast-1.amazonaws.com/test-image:<< parameters.env >>
          docker pull ${Image}
          docker create -v /data --name mounter alpine:latest /bin/true
          docker cp  ~/admin mounter:/data
          docker run --volumes-from mounter --name builder bundle install --path /data/admin/vendor/bundle --gemfile=/data/admin/Gemfile
          docker cp builder:/data/admin/vendor /root/admin/

最初普通の -v でjob作ったんだけど、mountされなかった。 あと、volumes-fromは実際mountしてるわけでないのか?

以下リンクにrwでもマウントできると書いてあるけど、volumes-fromでrunしたcontainer上の変更が反映されないからcpでホスト側にコピーしてる

docker run | Docker Documentation

machine trueにしないと、普通の-vではmountできないようなので、以下のようにした。

  • alpine上に/data を作る
  • ~/adminをalpine上にcpする
  • ecr imageをvolumes_fromで見ながらcontainer up
  • ホスト側に変更情報が共有されないから再度containerからホスト側へcp

job

jobs:
  docker:
    - image: ruby:2.5
  build-job:
    - checkout
    - $(aws ecr get-login --no-include-email)
    - build_on_docker:
         env: 'staging'

後日談

実はこんなことをしなくてもcontextsを使って付与してあげるなり、access_keyを使うなりすればECRのイメージをbuildに使うdockerとして使えることがわかった。

参考URL

stackoverflow.com

circleci.com