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


Dockerfile

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

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

Terminal window
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という軽量の公式イメージが有るため、それを使用すると良いだろう