Ruby
Rails
CentOS
docker

Docker上でRails環境をバージョン指定して構築

初めに

Docker上でRails環境を構築してみます。

以下の記事を参考にし過ぎています。m(_ _)m
https://qiita.com/takaeda/items/956e2cda03d289fe4630
railsのバージョン指定とgem install bundleが失敗してしまう部分(*)が修正点が差分になります。
*gem install bundlerだと途中で、ねえねえbundleに読み替えてもいい?と入力が求められて,
buildが失敗してします。

+で以下を参照
centosの公式リポジトリ
https://hub.docker.com/_/centos/

Dockerfile リファレンス
http://docs.docker.jp/v1.12/engine/reference/builder.html

ゴール

Docker上で以下の環境を作ることをゴールにします。
- CentOS 7
- ruby 2.4.2
- rails 5.1.4

CentOSは実際にはなくても良いが普段yumに慣れているため構築する。
普段CentOS系を使っていればDockerfileの内容を理解し易いと思う。

Docker環境

Docker version 17.06.1-ce, build 874a737

※DockerはDocker for Macを利用しています。

結論

結論を先に書いてしまうと、以下のDockerfileを作ってbuildするだけ。(まじでDocker便利すぎ)

Dockerfileの作成

以下のようにDockerfileを作る

vi Dockerfile
FROM centos:7

# rubyとrailsのバージョンを指定
ENV ruby_ver="2.4.2"
ENV rails_ver="5.1.4"

# 必要なパッケージをインストール
RUN yum -y update
RUN yum -y install epel-release
RUN yum -y install git make autoconf curl wget
RUN yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel sqlite-devel bzip2
RUN yum clean all

# rubyとbundleをダウンロード
RUN git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build

# コマンドでrbenvが使えるように設定
RUN echo 'export RBENV_ROOT="/usr/local/rbenv"' >> /etc/profile.d/rbenv.sh
RUN echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile.d/rbenv.sh
RUN echo 'eval "$(rbenv init --no-rehash -)"' >> /etc/profile.d/rbenv.sh

# rubyとrailsをインストール
RUN source /etc/profile.d/rbenv.sh; rbenv install ${ruby_ver}; rbenv global ${ruby_ver}
RUN source /etc/profile.d/rbenv.sh; gem update --system; gem install --version ${rails_ver} --no-ri --no-rdoc rails; gem install bundle

docker buildでイメージを生成

Dockerfileを作成したディレクトリでbuildコマンドを実行
-t my_project/railsはタブ名なので任意
git clone部分は結構時間かかるかも

$ docker build -t my_project/rails .

最後にこんな感じで表示されれば成功

Successfully tagged my_project/rails:latest

ふむふむちゃんとできている。

$ docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED              SIZE
my_project/rails                        latest              f45aa2897fea        About a minute ago   1.04GB

docker runでコンテナ起動

ドキドキしながらdockerコンテナを起動してみます。
あらかじめ3000ポートは割り当てておく。

$ docker run -i -d -p 3000:3000 --name rails my_project/rails
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
44ffd087b9e7        my_project/rails    "/bin/bash"         4 seconds ago       Up 2 seconds        0.0.0.0:3000->3000/tcp   rails

railsでプロジェクト作成

docker execでコンテナ内へ

$ docker exec -it rails /bin/bash

rails newしてみると・・・

# rails new myapp

# cd myapp/

# ls -l
total 68
-rw-r--r--  1 root root 1974 Dec  6 12:53 Gemfile
-rw-r--r--  1 root root 4772 Dec  6 12:53 Gemfile.lock
-rw-r--r--  1 root root  374 Dec  6 12:53 README.md
-rw-r--r--  1 root root  227 Dec  6 12:53 Rakefile
drwxr-xr-x 10 root root 4096 Dec  6 12:53 app
drwxr-xr-x  2 root root 4096 Dec  6 12:53 bin
drwxr-xr-x  5 root root 4096 Dec  6 12:53 config
-rw-r--r--  1 root root  130 Dec  6 12:53 config.ru
drwxr-xr-x  2 root root 4096 Dec  6 12:53 db
drwxr-xr-x  4 root root 4096 Dec  6 12:53 lib
drwxr-xr-x  2 root root 4096 Dec  6 12:53 log
-rw-r--r--  1 root root   63 Dec  6 12:53 package.json
drwxr-xr-x  2 root root 4096 Dec  6 12:53 public
drwxr-xr-x  9 root root 4096 Dec  6 12:53 test
drwxr-xr-x  3 root root 4096 Dec  6 12:53 tmp
drwxr-xr-x  2 root root 4096 Dec  6 12:53 vendor

できたできた!
Gemfileのgem 'therubyracer'のコメントアウトを外してbundle install
(説明は省きますがtherubyracerがないと「Could not find a JavaScript runtime」を起こしちゃいます。)

# vi Gemfile

# bundle install

# rails s
=> Booting Puma
=> Rails 5.1.4 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.0 (ruby 2.4.2-p198), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

問題なく起動しましたね!
image.png

これでdocker環境があればチームで同じ開発環境を作れそう。
便利な世の中になったなぁ。