はじめに
- 新人が研修でRubyを勉強している
- でも俺はRubyをちゃんと触ったことがない
- なんか恥ずかしい
- せや、開発環境構築してなんかしたろ!!
というわけで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を足しています
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使うときと同じです。
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内でもコンテナ名で名前解決できることがわかったので、それぞれにこんな設定を書きました。
DATABASE_URL="mysql2://root:root@mysql:3306/development"
DATABASE_URL="mysql2://root:root@mysql:3306/development"
使い方
とりあえずREADME読んで見てください。
不足や誤りがありましたらご一報いただけると幸いです。
よーし、頑張ってRuby勉強するぞー。