EnsekiTT Blog

EnsekiTTが書くブログです。

docker-composeでRuby on Railsの開発を始めるための話

つまりなにしたの?

docker-composeは自前の環境に手を加えずに開発環境だったり疑似実行環境を作れたり本番環境を作れるのでとても便利。
ただ、Railsのプロジェクトをコピーしてくる場合はdocker-compose up で終わるけど、新規作成するときは少しややこしい。
今まではローカル環境でRailsプロジェクトを立ち上げ(rails new)してから実施していたやつを完全にDocke-composeだけで完結させようとおもう。
f:id:ensekitt:20180708211616j:plain

大まかな手順

  • ローカルで用意するべきディレクトリ構造を用意する
  • DockerファイルとDocker-Compose.ymlを用意する
  • BashでログインするRailsプロジェクトを立ち上げる(ここはなんとかする方法を考えたい)
  • 開発する

環境条件

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

f:id:ensekitt:20180708211309p:plain
以降はローカルで開発してGemの変更とかしたときだけdocker-compose buildしなおせば良さそう

今後の話

今回は作り始めからやったけど、やっぱりテンプレートになるGithubとかから引っ張ってきたほうがいいかもしれない。
このあと、Databaseの設定とかを色々やることになる。
ベストプラクティス的なのがあったら教えていただけると幸いです。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。