DockerとRails6

こんにちは!
デザイン・システム室の永尾です。

私は今年の7月に未経験のエンジニアとして入社させて頂きました。
その後約2ヶ月間の研修を経て9月より現場に参加させて頂いているのですが
今まで趣味程度のwebサービスしか触っていなかった自分は参加初日から、
既存サービスの規模感の大きさに圧倒されました。

見たことも無いファイルやテーブルの数

rails routes と入力すれば画面に映りきらない程のルーティング

この圧倒的なサイズ感

まるで富士山。これは富士山です。
今まで自分が作っていた物が、いかに小規模だったかを思い知らされます。
自分は剣岳の頂上にいたつもりが、実は高尾山の頂上でした。

しかし、高尾山には高尾山の魅力があります。
綺麗な景色、体力に自信がない人にも優しい高さ。
毎年多くの方々が観光に訪れるのには、それなりの理由があるからです。

現状、外出が困難な世の中ではありますが、
いつか何も気にせず外出ができるようになった時には
ぜひ皆様も登ってみては、いかがでしょうか。

ということで、今回は研修で使用したDockerの設定でつまずいた内容を展開したいと思います。

DockerでRails6の環境構築

今回現場でも使われているDockerの知識を深めるために
今まで深く触ってこなかったDockerを研修でも導入しました。

今回Dockerfileなどを作成するに当たり、ありがたいことに以下の和訳された公式ページや、先人の方々の多くの記事などが存在しており、ファイルを作成しながら、その方々に7回は心の中でお礼を言いました。

Docker File

https://docs.docker.jp/engine/reference/builder.html

Docker Compose

http://docs.docker.jp/compose/overview.html

Dockerfile

感謝の気持ちを7回心で唱え終わる頃、以下のDockerfileを作成することができました。
(アプリ名はsample_appとし、Railsは6.0.3を使用しています)

FROM ruby:2.6.5

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

RUN mkdir /sample_app
WORKDIR /sample_app
COPY Gemfile /sample_app/Gemfile
COPY Gemfile.lock /sample_app/Gemfile.lock
RUN bundle install
COPY . /sample_app

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

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

難所だと感じていたDockerfileを作成できた私は、残りの必要なファイルも玉置浩二の田園を鼻歌で歌いながら、作成していきました。

鼻歌が止まる

必要なファイル一式を揃えた私は、以下のコマンドをコーヒー片手にドヤ顔で入力しました。

$ docker-compose up

すると、コンテナは立ち上がらず異常終了しました。驚きで私の鼻歌は止まりました。
よく見てみると以下のエラーが表示されています。

Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /sample_app/config/webpacker.yml (RuntimeError)

webpacker

webpackerをインストールしろと怒ってくるsample_appに対して、
「いや、今までなくても大丈夫だったじゃないか!!」
と今までRails5で開発していた私は思いましたが、Railsガイドに以下の記述を発見しました。

WebpackerがRails 6のデフォルトJavaScriptコンパイラになる

Railsガイド 4.3 主な変更

はい、すみませんでした。
私の知識不足が原因なのに、なぜ腹を立てていたのか。
さっきまでの自分が恥ずかしいです。

しかし、過去は変えれません。
私はこの現状を変えるため、webpackerをインストールするために必要なyarn、node.js をインストールする記述をDockerfileに追記しました。

FROM ruby:2.6.5

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
  curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
  echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
  apt-get update && apt-get install -y yarn

# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
  apt-get install nodejs

RUN mkdir /sample_app
WORKDIR /sample_app
COPY Gemfile /sample_app/Gemfile
COPY Gemfile.lock /sample_app/Gemfile.lock
RUN bundle install
COPY . /sample_app

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

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

そして、一度コンテナを落とした後、webpackerをインストールし
再度以下のコマンドを入力し、Dockerを用いた快適な開発環境を得ることが出来ました。

$ docker-compose up

まとめ

Rails6での開発が初めてにも関わらず、仕様変更を把握せずに手を動かし始めたがために、発生した恥ずかしい事象でした。
基礎中の基礎ではありますが、バージョンが異なるものや、何かに初めて触れる場合の、ドキュメントに目を通す重要性を改めて実感しました。

ファンデリー デザイン・システム室では現在メンバーを募集しています。
少しでも興味を持たれた方、ぜひご応募ください。
お待ちしております!