つまりなにしたの?
docker-composeは自前の環境に手を加えずに開発環境だったり疑似実行環境を作れたり本番環境を作れるのでとても便利。
ただ、Railsのプロジェクトをコピーしてくる場合はdocker-compose up で終わるけど、新規作成するときは少しややこしい。
今まではローカル環境でRailsプロジェクトを立ち上げ(rails new)してから実施していたやつを完全にDocke-composeだけで完結させようとおもう。
大まかな手順
環境条件
Dokcer
docker --version Docker version 18.03.1-ce, build 9ee9f40
Docker-compose
% docker-compose --version docker-compose version 1.21.1, build 5a3f1a3
用意するディレクトリの構造
. ├── app │ ├── Dockerfile │ ├── Gemfile │ └── Gemfile.lock └── docker-compose.yml
app/Dockerfileを準備する
# Develop Environment FROM ruby:2.4.4 ENV LANG C.UTF-8 RUN apt-get update && apt-get install -y build-essential mysql-client nodejs busybox dos2unix RUN gem install bundler RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ADD ./Gemfile /usr/src/app/Gemfile ADD ./Gemfile.lock /usr/src/app/Gemfile.lock RUN bundle install --without production EXPOSE 3000 CMD rails server -b 0.0.0.0
Docker-compose.ymlを用意する
version: '3' services: db: image: mysql:5.7 environment: - MYSQL_ALLOW_EMPTY_PASSWORD= "yes" volumes: - ./mysql/volumes:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d ports: - "3306:3306" app: build: context: ./app environment: RAILS_ENV: development RDS_HOSTNAME: db RDS_DB_NAME: develop volumes: - ./app:/app ports: - "3000:3000" depends_on: - db
プロジェクトを立ち上げる
$ docker-compose run -rm app /bin/bash DOCKER_SHELL$ cd .. # appの一つ上のディレクトリに移動する DOCKER_SHELL$ gem install rails DOCKER_SHELL$ rails new app --skip-git # ここでGemfileがコンフリクトするので上書きする DOCKER_SHELL$ exit $ docker-compose build
以降の開発
$ docker-compose up
以降はローカルで開発してGemの変更とかしたときだけdocker-compose buildしなおせば良さそう
今後の話
今回は作り始めからやったけど、やっぱりテンプレートになるGithubとかから引っ張ってきたほうがいいかもしれない。
このあと、Databaseの設定とかを色々やることになる。
ベストプラクティス的なのがあったら教えていただけると幸いです。