既存のRailsアプリをDocker上で起動させる

#はじめに
railsを勉強しているのですが、勉強のために、サンプルコードなどを自分の環境上で動かしたかったのですが、
githubなどに上がっているサンプルコードをdocker上で立ち上げるのに苦労したのでメモします。

新規のプロジェクトを立ち上げる際のDockerFileの書き方は情報がたくさんあったのですが、
既存のものを立ち上げる際の情報はほとんど無くて、あってもRuby2.4のものだったりしたので、
いろいろなサイトを参考にして、Ruby2.5環境で既存のプロジェクトを立ち上げるためのコンテナ構築をしました。

#Ruby2.5でのDocker環境構築

ディレクトリ構造(完成形)
workディレクトリでrailsアプリ(DockerFileのないもの)をクローンします。

```
sampleapp/
　├ work
　│　└ app/
　│　└ config/
　│　└ ...
　│　　
　├ Dockerfile
　└ docker-compose.yml
```
 
作業用ディレクトリを作成し、GithubからRailsプロジェクト(DockerFileのないもの)をクローンします。
クローンしたら、dockerコマンドを入力するためにsampleappディレクトリに戻ります。

```
$ cd
$ mkdir sampleapp
$ cd sampleapp
$ mkdir work
$ cd work
$ git clone ....(URLを入れる)
$ cd ..
```

Dockerfile

```Docker
FROM ruby:2.5
#日本語対応
ENV LANG C.UTF-8
#作業用ディレクトリを作成
ENV ROOT_PATH /work
RUN mkdir -p $ROOT_PATH
WORKDIR $ROOT_PATH
#Railsアプリに必要なパッケージをインストールする
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
        && apt-get install -y nodejs build-essential libpq-dev\
	 && rm -rf /var/lib/apt/lists/*
#Rspec用chromedriver
RUN apt-get update && apt-get install -y unzip && \
    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable

ADD ./work/Gemfile $ROOT_PATH/Gemfile
ADD ./work/Gemfile.lock $ROOT_PATH/Gemfile.lock

RUN gem install bundler
RUN bundle install


ADD ./work $ROOT_PATH
```
docker-compose.yml

```yml

version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_USER: root
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
    ports:
      - "3306:3306"

  web:
    build: .
    command: bundle exec rails s -b 0.0.0.0
    environment:
    volumes:
      - ./work:/work:cached
    ports:
      - "3000:3000"
    links:
      - db
```
railsアプリのconfig/database.ymlでデータベースとの接続情報を編集します。
以下、work/config/database.yml

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: db

# development環境だけ書き換えてます。
development:
  <<: *default
  username: root
  password: 
  database: docker_development

test:
  <<: *default
  database: docker_test

production:
  <<: *default
  database: docker_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
```
設定が終わったらビルドします。

```terminal
$ docker-compose build
$ docker-compose exec web rails db:create db:migrate
```
railsアプリに必要なパッケージやgemがインストールできるので、
終わったらdocker-compose upで起動させます。

localhost:3000でアプリのトップページにアクセスできます。

3306や、3000の部分はポートがかぶらないように、お好みの番号に設定できます。
※指定できないポートもあるので、エラーが出る際は下記のサイトなどを参考にするといいと思います。

開発中、ChromeでERR_UNSAFE_PORTエラーが出たときにチェックすべきこと(312エラー)：http://nanoappli.com/blog/archives/7772

あとは新規からアプリを作成する時と同じように開発できます。


#参考にしたサイト

既存railsプロジェクトのdocker運用開始時の作業録：https://www.dendoron.com/boards/50
Docker+既存Rails(+Puppeteer)　やっぱりdockerで環境作るのを諦められなかった話：https://note.com/mick_sato/n/nfb521d6b2a4c
開発中、ChromeでERR_UNSAFE_PORTエラーが出たときにチェックすべきこと(312エラー)：http://nanoappli.com/blog/archives/7772