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