docker超入門 rails6対応

動画投稿時点(2018/11/12)でrailsの最新バージョンは5だった様ですが、
現時点(2020/07/25)ですでにver 6が出ており、
当時のdocker設定ではrails 6が動かない。というコメントをいただきました。
いただいたコメントで動かない原因など丁寧に書かれてあり、そちらを参照いただければ解決する問題ではあるのですが、一応情報をまとめておいた方が良いだろう。ということで記事にした所存でございます。

動画にしなかったのは、rails環境構築それ自体はdockerの本質とはあまり関係がないので、記事の方がいいだろう。ということで。

動かなくなってしまった原因

さて、rails6ですが、yarn(nodejsのパッケージマネージャ)への依存が増えているせいでrails5時代の設定では動きません。(nodejsへの依存はrails5時代からあった。)
内部でwebpackが動くみたいですね。

個人的にはrails動かすために、nodejs入れなきゃいけないなら、nodejsで書けばいいじゃん。。と思ってしまいます。
ちなみに私はrails2時代を最後にほとんど触ってません。なのでrails自体の解説はできそうにありませんのであしからず。

Dockerfile

rails6対応のDockerfileはこうなります。↓

FROM ruby:2.7.1-buster

RUN gem install rails

RUN apt-get update && \
   apt-get install -y nodejs npm
RUN npm install -g yarn

ついでなので、rubyのバージョンも最新にしてみました。
rails5時代のDockerfileと比べてみましょう。

# rails5時代のDockerfile
FROM ruby:2.5.3-stretch

RUN gem install rails

RUN apt-get update && \
   apt-get install -y nodejs

FROMはもちろん変更していますが、
npmを追加でインストールし、npmコマンドでyarnをインストールするようにしています。
(npmコマンドはyarnをインストールするためだけに必要。。)

Docker超入門の動画を見ている方向け

動画通りやっても動かなくてがっかりした方。申し訳ありませんmm

docker-compose up コマンドをすでに実行している場合、
Dockerfileを書き換えてから

docker-compose build app

を行ってください。
rails new コマンドを実行済でrailsを5から6にバージョンアップしたい場合は、

こちらを参考にmigrateする必要があるみたいです。(結構大変そう)

一旦まっさらにしても良ければ、Dockerfile, docker-compose.yaml、mysql-dataフォルダ以外を全て消して↓を行えば良いです。

rails new コマンド未実行の場合は、

cd <docker-compose.yaml があるディレクトリ>
docker-compose up

# 別のターミナルで
cd <docker-compose.yaml があるディレクトリ>
docker-compose exec app bash
cd /app
rails new . --template=mysql
# config/database.yml を編集。(後述)
rake db:create
rake db:migrate
rails s -b 0.0.0.0

でrailsが起動します。
config/database.ymlは
passwordが空になっているはずなので、rootを追記。
hostがlocalhostなのをmysqlに修正すればOKです。↓

default: &default
 adapter: mysql2
 encoding: utf8mb4
 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
 username: root
 password: root # root追記
 host: mysql # localhost -> mysql

Docker超入門を見ていない人向け

docker-compose.yaml をDockerfileと同じフォルダに作成してください。
内容は以下。

version: '3'
services:
 mysql:
   image: mysql:8.0.13
   command: --default-authentication-plugin=mysql_native_password
   volumes:
     - "./mysql-data:/var/lib/mysql"
   environment:
     MYSQL_ROOT_PASSWORD: root
 app:
   build: .
   volumes:
     - ".:/app"
   ports:
     - "3000:3000"
   tty: true
   depends_on:
     - mysql

あとは、「rails new コマンド未実行の場合は」と同じ手順でrailsサーバを動かしましょう。

ただ動けばいいんだ!という人向け

こちらのリポジトリからappendix/rails6 ブランチをチェックアウトしてください。​

rails new, config/database.ymlの書き換えは実施済です。

cd <docker-compose.yaml があるディレクトリ>
docker-compose up

# 別のターミナルで
cd <docker-compose.yaml があるディレクトリ>
docker-compose exec app bash
cd /app
rake db:create
rake db:migrate
rails s -b 0.0.0.0

でrailsサーバが立ち上がります。

ついでに

docker-compose.yamlのappコンテナの設定に

working_dir: /app

を追記すると、appコンテナに入ったら、/appディレクトリ以下にcdしている状態にできます。
当時はこういう便利な設定をあまり知らなかったんですが、今は必ず設定しています。

volumesも"cached"や"delegated"をつけてあげるとマウントしているが故のファイルアクセスの遅さを軽減することができます。
(副作用もあるので、気をつけて!)

volumes:
     - ".:/app:cached"

詳しくはこちら。日本語でおkって方はqiitaで探すといいかも。

さいごに

動かない。わからないなどあればお気軽にコメントください。

この記事が気に入ったらサポートをしてみませんか?