docker-composeのvoluemsとcopyの話(超初心者)

超初心者ながら、仕事でdockerというものを初めて触り「なんか面白いもの作れるのでは?」と思って自分でrubyのスクレイピングができる環境を構築してみたいと思った。

やりたかったこと

alpineベースのdockerにruby環境を構築

実際のコード

docker-compose.yml
version: '2'

services:

    play:

        build: ./

        container_name: play
Dockerfile
FROM alpine:3.5

RUN apk update && \
    apk upgrade && \
    apk add --no-cache \
    bash \
    curl-dev \
    ruby-dev \
    build-base \
    git \
    ruby \
    ruby-irb \
    ruby-io-console \
    ruby-rdoc \
    ruby-bundler
RUN mkdir /root/src
COPY ./src/ /root/src
WORKDIR /root/src

RUN bundle install

CMD ["top"]
ディレクトリ構成
/project_name
  /src
    Gemfileとか
  docker-compose.yml
  Dockerfile

詰まった点

Dockerfileにbundle installを記述しているのでbuildするタイミングで毎回bundle installが走ってしまう... 今回nokogiriを使いたいので毎回こんなにbuildに時間がかかってしまうと困る。 じゃあ、一回bundle installしたものをホスト側でキープすればいいのでは?と思い実装してみる。

実際のコード

version: '2'

services:

    play:

        build: ./

        container_name: play
        volumes:
          - ./src:/root/src #追加
FROM alpine:3.5

RUN apk update && \
    apk upgrade && \
    apk add --no-cache \
    bash \
    curl-dev \
    ruby-dev \
    build-base \
    git \
    ruby \
    ruby-irb \
    ruby-io-console \
    ruby-rdoc \
    ruby-bundler

WORKDIR /root/src

RUN bundle install --path .bundle

CMD ["top"]
これで、dockerコンテナ内で実行したbundle installの.bundleファイルがホスト側にも追加されると思ったら、
ERROR: Service 'play' failed to build: The command '/bin/sh -c bundle install --path .bundle' returned a non-zero code: 10
bundle installできないよ!と言われてしまった... いろいろ調べて見たところ、docker-compose.ymlのvolumesによってフォルダがマウントされるのはbuildを実行した後なので、Dockerfileのbundle installする段階ではファイルが見つからなくて実行できないよ!って事らしい...

実行順番

  1. docker-compose.ymlのbuildが呼ばれる
  2. Dockerfileが呼ばれる
  3. volumesによってフォルダがマウントされる