DockerでRails環境をつくってみた

概要

DockerでRails環境を作りました。

環境

目標

db含めコンテナとホストをマウントさせつつ、この画面を出すことを目標とします。 f:id:kenzo36:20180828203544p:plain

手順

Dockerはインストールされている前提で進めます。

1. ディレクトリとファイル構成

適当なディレクトリを作り、ファイル構成を以下のようにします。

.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── docker-compose.yml
├── .env

2. Dockerfile定義

imageの元となるDockerfileを定義します。
SugitoClub(僕が所属する社会人サッカーチームの名前(応援よろしくお願いします笑))というディレクトリをコンテナ上に作り、そのディレクトリをワーキングディレクトリとします。
Rubyイメージ自体がDebianイメージをベースにしているため、apt-getとかしているようです。

FROM ruby:2.5.0
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /SugitoClub
WORKDIR /SugitoClub

COPY Gemfile /SugitoClub/Gemfile
COPY Gemfile.lock /SugitoClub/Gemfile.lock
COPY . /SugitoClub
RUN bundle install

3. Gemfile*定義

ホストのGemfileをコンテナ側にコピーし、bundle installしたものをimageとするためにGemfileとGemfile.lockを作る必要があります。

Gemfile

source 'https://rubygems.org'

gem 'rails', '5.1.5'

Gemfile.lockは作っておくだけで大丈夫です。

$ touch Gemfile.lock

4. docker-copose.yml定義

コンテナを実行しているホストのディレクトリを、コンテナ内のディレクトリとしてマウントすることができます。 このマウントされた領域をVolumeというそうです。 volumesで「ホスト : コンテナ」とすることでマウントできます。

version: '3'

services:
  db:
    image: mysql:5.7
    env_file: .env
    ports:
      - "3306:3306"
    volumes:
      - ./db/mysql_data:/var/lib/mysql:cached

  web:
    build: .
    depends_on:
      - db
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
      - 3000:3000
    volumes:
      - .:/SugitoClub:cached

5. .env定義

docker-compose.ymlで参照するenvfileです。

MYSQL_USER=任意のユーザー名
MYSQL_ROOT_PASSWORD=任意のパスワード

6. 実行

$ docker-compose run web rails new . --force --database=mysql
$ docker-compose up --build

rails newでGemfile*が更新されているのでイメージをビルドし直す必要があります。 localhost:300にアクセスすると期待していた画像がでてきました。

まとめ

最後の方はかなり端折ってしまいましたが、思っていたより簡単に環境をつくることができました。
Shut the fuck up and write some codeが沁みますね。

Rubyの真偽値を返すメソッドを作るとき

def user_exist?

  user = find_user

  user ? true : false

end

などとやっていることが多かったが、

def user_exist?

  !!find_user

end

という書き方ができることを知った。

これはRubyにおける否定(!)をさらに否定(!)していることになり、結果的に期待した真偽値が返ることになる。

いとじゅんさんの「プロを目指す人のためのRUBY入門」より。

シンボリックリンク

Linux系OSで階層が深いディレクトリをいちいちcdするのがめんどくさい時、 例えばDesktopディレクトリ以下のhogeディレクトリ以下のfugaディレクトリへcdする時、いちいち

$ cd Desktop/hoge/fuga

とやるのがめんどくさい。 のでhomeディレクトリから

$ cd fuga

とやりたい。そんな時はhomeディレクトリで

ln -si Desktop/hoge/fuga/ ~/piyo

とやるだけでok。 ちなみに lnがリンクを貼るコマンド。 -sがシンボリックリンク、-iが同名ファイルがある時の確認。