【Imagemagick対応】Dockerを利用して、Rails環境を作成

# はじめに
- 初心者の方でも簡単に再現可能
- Imagemagickが使用可能
- この記事は、以下の記事を参考にして作成しています
- Heroku にもビルド可能なイメージです
> DockerComposeでコンテナベースのRailsアプリを作成してそのままHerokuにデプロイする
> https://qiita.com/akirakudo/items/16a01271b0a39316e439 

- 引用元記事での問題点
    - __rmagickが使用できない__
    - 引用元記事では、ベースイメージにalphineを採用
    - このベースイメージでは、Imagemagick 7 が使用されており、gem install rmagick でエラーが発生する
    - gem rmagick では、Imagemagick 6 までしか対応していないことが原因
    
- 対策
    - ベースイメージを alphine から Debian へ変更


# 環境構築方法
- コンテナの概要
    - RailsコンテナとPostgreSQLコンテナから構成
    - 両者は、local環境のカレントディレクトリにマウントされている<br>（※カレントディレクトリ = Dockerfileが置いてあるディレクトリのこと）
    - Railsコンテナはポートフォワーディングにより、localhost:3000からアクセス可能
- <img width="438" alt="コンテナ構成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/177cc741-0e01-e8ae-86d1-af2b85cc36be.png" title="コンテナ構成">

- コンテナ構築方法
    - 以下記載の手順をそのまま実行してください

## 1. フォルダ、ファイルの準備
- 好きな場所にフォルダを新規作成
- フォルダ内に4つのファイルを作成（中身は空でOK）
- 例）この記事では、フォルダ名を`hoge_folder`としています

    - hoge_folder <br>
       ├ Dockerfile <br>
       ├ docker-compose.yml <br>
       ├ Gemfile <br>
       ├ Gemfile.lock <br>

## 2. ファイルの編集
- 1. で作成した4つのフォルダに以下の内容をコピペする

### ① Dockerfile
```Dockerfile:/hoge_folder/Dockerfile

FROM ruby:2.6

ENV RUNTIME_PACKAGES="linux-headers libxml2-dev libxslt-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql" \
    DEV_PACKAGES="build-base curl-dev" \
    HOME="/myapp"

WORKDIR $HOME

# Counter Measure to Error:"Autoprefixer doesn’t support Node v4.8.2. Update it"
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs

RUN apt-get update && \
    apt-get install -y mysql-client \
    postgresql-client \
    sqlite3 \
    --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

ADD Gemfile      $HOME/Gemfile
ADD Gemfile.lock $HOME/Gemfile.lock

RUN bundle install

ADD ./ $HOME
COPY ./ $HOME

CMD ["rails", "server", "-b", "0.0.0.0"]
```

### ② docker-compose.yml
```/hoge_folder/docker-compose.yml
version: '3'
services:
  db:
    container_name: postgress_db
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: 'postgres'

  web:
    container_name: rails_app
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

### ③ Gemfile
```Gemfile:/hoge_folder/Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.2'

gem 'rmagick'
```

### ④ Gemfile.lock
```/hoge_folder/Gemfile.lock
```
注）Gemfile.lock の中身は空です

- これでコンテナを立ち上げる準備ができました。


## 3. コンテナの立ち上げ準備
- CLIを起動する（bash,コマンドプロント等、ご自身の環境でお使いのものを起動してください。）
- Dockerfileのあるディレクトリに移動する
    - この記事で言えば、 `cd /home/...(以下略).../hoge_folder`
    
- 以下のコマンドを入力

```bash:コマンド
$ docker-compose run web rails new . --force --database=postgresql
```
※実際に入力する際は、`$マーク`を消してください

- コマンドを実行すると、作業フォルダ内（hoge_folder）に複数のフォルダが生成される

- Databaseの設定を変更する
    - このままではpostgreSQLコンテナにアクセスできないため
    - `config/database.yml`を開いて、下記内容を上書きする

```/hoge_folder/config/database.yml
  default: &default
  adapter: postgresql
  encoding: unicode
  host: db           # 上書き
  username: postgres # 上書き
  password: postgres # 上書き
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
```

- docker-compose.ymlがあるフォルダ上でビルドする

```bash:コマンド
$ docker-compose build
```

- データベースを作成し、マイグレーションする

```bash:コマンド
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
```

- ここまでで、コンテナの準備は終了です。

## 4. railsの起動確認
- docker-compose up でrailsは自動で立ち上がる

```bash:コマンド
$ docker-compose up
```

- Webブラウザで`http://localhost:3000`にアクセスしてみる
    - Yey ! 君はrailsの上にいるze !
    - <img width="500" alt="rails_top.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/a00b6327-df6a-d52c-effd-8cbf1a4f618e.png">


- railsの起動停止

```bash:コマンド
(再起動する場合）
$ docker-compose restart
（停止する場合）
$ docker-compose stop
```
## >> 次の記事
- Rails on Docker で作ったWebページを公開してみよう

> Dockerで作成したRailsアプリをHerokuにデプロイ
> https://qiita.com/NA_simple/items/57ad10717568fea2160b

## 謝辞
- @akirakudo さんの記事は、大変参考になりました

> https://qiita.com/akirakudo/items/16a01271b0a39316e439