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する段階ではファイルが見つからなくて実行できないよ!って事らしい...
実行順番
- docker-compose.ymlのbuildが呼ばれる
- Dockerfileが呼ばれる
- volumesによってフォルダがマウントされる