今さらRailsに手を出すのもしゃくなのでHanamiの開発環境をDockerで作ったった

はじめに

  1. 新人が研修でRubyを勉強している
  2. でも俺はRubyをちゃんと触ったことがない
  3. なんか恥ずかしい
  4. せや、開発環境構築してなんかしたろ!!

というわけでDocker-composeを使って今話題らしいHanamiの環境を作ってみました。

完成品はこちら

Hanamiってなんぞ?

RubyのWebフレームワークです。公式サイトはこちら
公式サイトで謳っている文句を信じるなら

  • 速い
  • 軽い
  • 安全
  • 簡単

の4拍子が揃っているようです。多分Rails触ったことある人なら割とすんなり飲み込めそうです。
個人的にはRailsは使うコマンドがrailsだったりrakeだったりするのが辛かったのですが、こちらはbundle exec hanamiでだいたいなんとかなるみたいです。
あ、Railsの5.0以降だとrailsコマンドに統合されてるみたいですが、私は4系までしか触ったことがありません。

構成

hanami newで作成されるテンプレートにDockerfileとdocker-compose.ymlを足しています

Dockerfile
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN echo 'gem: --no-document' > ~/.gemrc \
  && bundle install

ADD . /app

まあ、Rails使うときと同じです。

docker-compose.yml
version: "3" 
services:
  mysql:
    image: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./containers/mysql:/var/lib/mysql
  adminer:
    image: adminer
    ports:
      - 8080:8080
    links:
      - mysql
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    command: "bundle exec hanami server --host 0.0.0.0 -p 2300"
    volumes:
      - .:/app
      - ./containers/bundle_install:/app/vendor/bundle
      - ./containers/bundle:/app/.bundle
      - ./containers/node_modules:/app/node_modules
    ports:
      - 2300:2300
    links:
      - mysql

こちらの記事を参考にしていますが、DBのコンテナは一つにして、DBの中身を確認できるようにadminerも用意しています。

コンテナ解説

用意したコンテナは下記の通りです

  • mysql
  • adminer
  • app

本当はキャッシュとしてredisも入れたかったのですが、Hanamiのどこに仕込めば良いのかよくわからなかったので...
これから勉強してわかったら追記します。

mysql

MySQLのコンテナです。
それ以上説明することは特にありません。

adminer

adminerのコンテナです。
コンテナ起動後、localhost:8080にアクセスすれば見られます。
DBのホストはmysql、ユーザー名とパスワードはどちらもrootでログインできます。
DBホストがmysqlでログインできるのはdocker-composeがymlに記載されたコンテナ名で名前解決できるようにネットワークをよしなに設定してくれているからです。

なので、別にdocker-compose.yml以外のファイル内でもdocker-composeのネットワーク内であれば、mysqlとかadminerで名前解決できます。

app

Hanamiの本体です。
起動したらlocalhost:2300にアクセスしたら画面を見れます。

参考ページではdocker-compose.yml内で環境変数DATABASE_URLを定義していますが、これだと開発環境でもテスト環境でも同じDBを参照してしまいます。
(参考にした記事では開発用とテスト用でDBコンテナを分けてますが、投稿した@shibabuki_yuta さんも改善の余地はあると感じている模様)

色々試して見たところ、.env.developや.env.test内でもコンテナ名で名前解決できることがわかったので、それぞれにこんな設定を書きました。

env.develop
DATABASE_URL="mysql2://root:root@mysql:3306/development"
env.test
DATABASE_URL="mysql2://root:root@mysql:3306/development"

使い方

とりあえずREADME読んで見てください。
不足や誤りがありましたらご一報いただけると幸いです。

よーし、頑張ってRuby勉強するぞー。

参考