Rails 用の Dockerfile/docker-compose.yml を用意しておく

【追記】

この手順でやってもうまくいかない事が分かった。 以下は参考程度ということで。もうちょっとよいやり方を思いついたらまた書きます。


docker 便利で、もうローカルに開発環境を構築したくない。今の新しい職場ではほとんどの環境が docker 化されてるので、もはや rbenv などもインストールしていない。

というわけで、仕事中にある gem の挙動を rails の最小構成で試したくて、そういう Dockerfile/docker-compse.yml を用意した。それをメモとして残しておく。

使い方

上記2ファイルを適当な空ディレクトリにおいて、以下を実行:

$ docker-compose build
$ docker-compose run --rm rails new --database=mysql .

とした後に config/database.yml を以下のように変える:

diff --git a/config/database.yml b/config/database.yml
index 6003576..7ea3a9a 100644
--- a/config/database.yml
+++ b/config/database.yml
@@ -15,7 +15,7 @@ default: &default
   pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
   username: root
   password:
-  host: localhost
+  host: <%= ENV['DATABASE_HOST'] %>

 development:
   <<: *default

その他、開発に必要なコマンド群は以下:

# rails の起動
$ docker-compose up -d

# bundle install する
# 単純に `docker-compose run --rm rails bundle install` だと
# install が終わった瞬間にそのコンテナが破棄されて、インストールされた gem 達は消え去るので注意
$ docker-compose build

# rails/rake タスクの実行
$ docker-compose run --rum rails <コマンド名>

# binding.pry でデバッグしたい時
# 画面を抜けるにはCtrl-p Ctrl-q
$ docker attach $(docker-compose ps -q rails)

# container のログ(==実質railsのログ)を tail する
$ docker-compose logs -f --tail=20 rails

# container の起動状態の確認
$ docker-compose ps

docker-compose.yml

docker-compose.yml に書くサービス名は db/web としているのを見る事が多い。けど個人的には明示的な方が好きなので rails としている。ただこうすると docker-compose run --rm rails rails db:migrate みたいな感じで rails と二回打つ事になって奇妙な感じもする。 web の方が良いかもしれない。

ちなみに docker-compose run --rm は多用するので dr と alias してて、今回の場合だと dr rails rails db:migrate と打つ事になる。この alias は結構便利でお気に入り。外にも alias dl="docker-cmpose logs -f --tail=20" とか alias dc="docker-compose" とかもある。便利。もはや git 並によく使うコマンド群な気がする。

バージョンとかデータベースとか、その辺はこのファイルをベースに良い感じに変える想定。

Dockerfile

Dockerfile をわざわざ書いているのは、謎 container image を使うのが嫌だなぁと思ったから。こういうのって忘れた頃に必要になって、そういう時に過去の自分が push した image を使うってなると(それはもう謎 image だ)、どんな image で何が入ってるんだっけ、みたいに思い起こす作業から始まる事を考えた。プレーンな image の上に何が載ってるいるか分かった方が気持ちいい気がしている。

依存ライブラリの話。 tzdata は必須。これがないと rails が起動しない。 less はあるとデバッグに便利。 pry がページャーとしてデフォルトで less -R 使うんだけど、これが alpine linux には入ってなくて情報が表示されない。なので入れてる。(ちなみに環境変数として PAGER='busybox less' 渡せば動くのだけど、色付けがされず、すごく見づらい。)(そもそも alpine linux じゃなくて良いのでは説はあると思う)


もっと良い書き方・方法等知っていたら教えてください。