テンプレート: Docker コンテナで Ruby / Rails の開発環境を構築する(Ubuntu版)

手軽に Ruby / Rails の開発環境を構築したいなら Docker が最適です。
ここでは、ホストOSとしてUbuntuを使用しています。
[(Macホストの場合はこちらを参照してください)](http://qiita.com/TYD/items/f58b6798aaf25186d2a9)

Dockerコンテナでは、ベースOSをUbuntu 20.04とし、Rails アプリケーションを実行するために必要なライブラリやRuby本体をインストールしていきます。
Railsアプリケーション本体はホストOS上のローカルディレクトリから参照できるようにします。
これはRailsアプリケーションの実行環境をDockerコンテナが担い、エディタによるRailsアプリケーションの編集やソースコード管理をホストOS上で実現するためのものです。

以下のようなメリットがあります。

1.ホストOS上にRubyやRailsを直接インストールする必要がない
2.必要に応じて異なるバージョンのRubyやRailsを別々のコンテナで実行させることも可能
3.RailsソースコードはホストOS上の好みのエディタで編集できる
4.Gitの管理対象をホストOS上のソースコードに限定できる
5.(以下のDockerfile.devもGitの管理対象とすべき)

##コンテナの構築と起動

あらかじめDockerサービスをホストOS上にインストールしておいてください。

まずは、任意のディレクトリに以下のファイルを配置します。

```Dockerfile.dev
# Docker による Ruby / Rails 開発環境の構築
#
# 任意バージョンの Ruby を Ubuntu ベースのコンテナ上にインストールする
# また、node.js をインストールする
# Rails アプリケーションは、コンテナ内ではなく、ホストOSのローカルディレクトリに生成する

From ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

# ローカルと同じユーザを作成する
ARG uid=unknown
ARG user=unknown
RUN useradd -m -u ${uid} ${user}
# ユーザのパスワードを仮に password と設定する
RUN echo "${user}:password" | chpasswd

# # Ubuntu にインストールされているソフトウェアを最新にする
RUN apt-get update -y
RUN apt-get upgrade -y

# Ruby のビルドに必要なパッケージを apt-get 経由でインストールする
RUN apt-get install -y build-essential
RUN apt-get install -y libssl-dev libreadline-dev zlib1g-dev
RUN apt-get install -y git wget 

# sqlite3 を利用する場合に必要なライブラリ
RUN apt-get install libsqlite3-dev

# MySQL or MariaDB を利用する場合に必要なライブラリ
RUN apt-get install -y libmysqlclient-dev

# その他の便利ツール
RUN apt-get install -y sudo nano telnet

# ruby-build を使って任意の Ruby バージョンをインストールする
RUN git clone --depth=1 https://github.com/rbenv/ruby-build
RUN PREFIX=/usr/local ./ruby-build/install.sh
RUN rm -rf ruby-build
RUN ruby-build 2.7.2 /usr/local

# node.js, npmをインストール
RUN apt-get install -y nodejs npm
# n packageをインストール
RUN npm install n -g
# n packageを使ってnodeをインストール
RUN n stable
# 最初に入れた古いnode.js, npmを削除
RUN apt-get purge -y nodejs npm
# yarn packageをインストール
RUN npm install yarn -g
```

以下はコンテナの生成方法
(your_app_nameをあなたのアプリケーション名に変更する)

```
$ export YOURAPP=your_app_name
$ docker build -t $YOURAPP --build-arg uid=$(id -u $USER) --build-arg user=$USER -f Dockerfile.dev .
```

コンテナを起動する

```
$ export REPO=`pwd`
$ docker run -d --name $YOURAPP -v $REPO/:/$YOURAPP/ -p 4000:3000 -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -u $(id -u $USER):$(id -g $USER) -ti $YOURAPP
```


##コンテナ内で Rails アプリケーションを生成する

コンテナ上のbashを起動し、Railsアプリケーションを構築していきます。

```
$ docker exec -ti $YOURAPP bash
```

あなたのアプリケーションディレクトリに移動する
(your_app_nameをあなたのアプリケーション名に変更する)

```
$ cd /your_app_name
```

bundle init を実行して Gemfile ファイルを作成

```
$ bundle init
```

Gemfile を編集する(以下ではnanoエディタを使用)

```
$ nano Gemfile
```

Gemfile内の # gem "rails" のコメントを外す
(# gem "rails" を gem "rails" に変更する)

bundle install により Rails 関連の Gem を vendor/bundle にインストールする

```
$ bundle config set path 'vendor/bundle'
$ bundle install
```

rails new により Rails アプリケーションをこのディレクトリで新規に生成する
Overwrite /example/Gemfile? (enter "h" for help) [Ynaqdhm] と尋ねられたら Y と返答する

```
$ bundle exec rails new .
```

Rails アプリケーションを起動する
ホスト OS からアクセスできるようにバインドする IP アドレスを 0.0.0.0 にしておく

```
$ bundle exec rails s -b 0.0.0.0
```

コンテナ上の作業が完了したので、改めてホスト OS のブラウザで http://localhost:4000 にアクセスする
ブラウザ上で Yay! You’re on Rails! が表示されたら成功です