動機
会社でRails案件を行うことになったので、docker-composeを使って開発環境の構築を行おうと思い手順書みたいに書いてみました。
なので、個々の説明は省きます
今回はlocal環境にあるRailsをdocker内に持っていって起動させることを目標にしてます。
サンプルコードはこちらになります
Rails
Railsは以前書いたMacでrailsプロジェクト立ち上げで行ったRailsを使用します。
上記Railsでdatabase.yml
に追記します。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: root # パスワード追加
host: <%= ENV.fetch("DB_HOST_NAME") { "localhost" } %> # 追加
Dockerfile作成
RailsドキュメントルートにDockerfile
を作成します。
FROM ruby:2.5.1-alpine
MAINTAINER admin
RUN cd /tmp \
&& apk --no-cache add \
curl \
curl-dev \
nodejs \
libstdc++ \
libxml2-dev \
libxslt-dev \
linux-headers \
mysql-client \
mysql-dev \
pcre \
ruby-dev \
ruby-json \
tzdata \
yaml \
yaml-dev \
bash \
build-base \
zlib-dev \
&& mkdir /sample_docker/
WORKDIR /sample_docker/
COPY Gemfile* /sample_docker/
RUN gem install bundler \
&& bundle install --clean --path /bundle
COPY . /sample_docker/
CMD ["bundle", "exec", "rails", "s"]
上記でRailsが起動できるOSやソース配置場所等を設定しています。
version: '2.1'
services:
rails_app:
stdin_open: true
build: .
environment:
DB_HOST_NAME: mysql
volumes:
- .:/sample_docker
- bundle:/bundle
ports:
- 3000:3000
links:
- mysql
mysql:
image: mysql:5.6
ports:
- 3307:3306
restart: on-failure
environment:
MYSQL_DATABASE: sample_docker_development
MYSQL_ROOT_PASSWORD: root
volumes:
bundle:
driver: local
rails_app はDockerfile
の環境で動作しmysqlは別のimage環境で動作するようになります。
一番下にマウント処理を設定して、driver: local
で明示的にlocal環境を見に行かせています。
これがないと、新たにGemfileにgemを追加した場合docker-compose run bundle install
だけではgemが入らなず、いちいちdocker-compose build
しなければならないので面倒です。
docker起動
dockerを起動する前にimageを作成します。
$ docker-compose build
その後、Railsで設定してあるDBとtableを作成します。
$ docker-compose run rails_app bundle exec rails db:create db:migrate
- 上記起動しなかった場合さきに
docker-compose up
を行ってから実行してみてください。
docker起動
$ docker-compose up
今後
まだまだ全然使いこなせていなんですが、今後は開発環境だけでなく本番環境でもdockerを使っていこうと思います。
チームで行うにはdockerを知っていないときついと思うので、どう共有するかも考えないといけないですね。