Dockerfileおよび,docker-compose.ymlを作成する時の注意点
Dockerfile
変更する頻度が高いものほど下に
Dockerでは一度実行したコマンドはキャッシュで状態を保持しているため、変更する頻度が高いものほど下に記述すべきである。
FROM ruby:2.3.1ENV ROOT_DIR /appRUN mkdir $ROOT_DIRRUN apt-get update && apt-get install -y build-essential
# install bundleCOPY Gemfile $ROOT_DIRRUN 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: - datastorevolumes: bundle_install: driver: local node_modules: driver: local mysql_data: driver: local
上記の例は、/app/vendoer/bundle
にインストール先を指定している場合である。 また、yarnやmysqlのデータを永続化する場合にもVolume専用のコンテナを用意すると良い。 Volume専用のコンテナはbusybox
という軽量の公式イメージが有るため、それを使用すると良いだろう