Dockerfileおよび,docker-compose.ymlを作成する時の注意点

Docker

Dockerfile

変更する頻度が高いものほど下に

Dockerでは一度実行したコマンドはキャッシュで状態を保持しているため、変更する頻度が高いものほど下に記述すべきである。

FROM ruby:2.3.1
ENV ROOT_DIR /app
RUN mkdir $ROOT_DIR
RUN apt-get update && apt-get install -y build-essential

# install bundle
COPY Gemfile $ROOT_DIR
RUN bundle install

上記の構成だと、例えばGemfileを更新した時に、# install bundleからDockerが再構築される。

docker-compose.yml

Volumeを活用しよう

Volumeを活用しない場合、例えば、bundle installを実行して、やっぱり環境を再構築しようと思った時に、せっかくbundle installしたものを再度インストールしなおす必要が出てくる。
そのため、Volume用のコンテナを用意してそこにbundle installしたものを配置すると良い。

以下はdocker-compose.ymlの構成例

version: '2'
services:
  datastore:
    image: busybox
    volumes:
      - bundle_install:/app/vendor/bundle
      - node_modules:/app/node_modules
      - mysql_data:/var/lib/mysql
  db:
    image: mysql
    environment:
      MYSQL_DATABASE: error_matome_development
      MYSQL_ROOT_PASSWORD: your-password
      MYSQL_USER: root
    ports:
      - "3306:3306"
  web:
    build: .
    command: bundle exec rails s -b '0.0.0.0'
    volumes:
      - .:/app
      - bundle_install:/app/vendor/bundle
      - node_modules:/app/node_modules
    ports:
      - "3000:3000"
    depends_on:
      - db
    volumes_from:
      - datastore
volumes:
  bundle_install:
    driver: local
  node_modules:
    driver: local
  mysql_data:
    driver: local

上記の例は、/app/vendoer/bundleにインストール先を指定している場合である。 また、yarnやmysqlのデータを永続化する場合にもVolume専用のコンテナを用意すると良い。 Volume専用のコンテナはbusyboxという軽量の公式イメージが有るため、それを使用すると良いだろう

コメント