RailsアプリをGKEに移植するときにやったこと
GAEで稼働していたアプリをGKE用に移植したので、そのときやったことを自分用にまとめておく
まずベースコンテナを作る
まずはRailsアプリを動作するためのコンテナを作成します。ベースとなるコンテナにアプリケーションをコピーすればアプリが動作するようにするのが目的です。
Railsアプリが必要とするベースコンテナの要件は以下のようになると思います。
- Ruby
- native extensionを利用しているgemが依存している様々なライブラリ
- Node.js
ライブラリは、nokogiri、mysql2のようなgemのための対応です。コンテナサイズを最小にするには、利用しているgemが依存しているライブラリだけをインストールすればよいのですが、今回はメジャーなgemが依存しているライブラリは全部入りにすることにしました。
Node.jsは、Asset Pipeline、Webpackerを利用する場合必要になります。rubyracerのようなgemでも対応可能ですが、Node.jsをインストールしてしまう方がよいと判断しました。
上記の要件を満たすコンテナがDockerHubにあればよかったのですが、探してもなかったので作成しました。
https://github.com/k0uki/docker-ruby-node
カレントディレクトリにアプリケーションが配置されているとして、下記のようなDockerfileでRailsアプリをコンテナ上で動作させることができるようになります。
FROM k0uki/ruby-node:2.6.5-10-slim ENV RACK_ENV=production \ RAILS_ENV=production \ NODE_ENV=production \ APP_ENV=production \ RAILS_SERVE_STATIC_FILES=true \ RAILS_LOG_TO_STDOUT=true \ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 COPY . /app/ WORKDIR /app RUN bundle install --without test development && yarn install && yarn cache clean RUN bundle exec rails assets:clobber assets:precompile CMD ["bundle", "exec", "rackup", "--port=8080", "-o", "0.0.0.0"]
ログを標準出力に出力する
ログは標準出力に出力するのが一般的です。Railsデフォルトではファイルに出力されるので、これを標準出力に変更します。 Rails5以降であれば、RAILS_LOG_TO_STDOUTという環境変数をtrueにすると標準出力に変更できます。 このとき、
STDOUT.sync = true
をinitializersかenvironmentsに追加しないと、出力がバッファリングされるので注意が必要です。
GKEにデプロイ
Dockernizeさえ出来てしまえば、GKEへのデプロイは何も特殊なことが必要ありません。
DBのmigrationのタイミングは、色々なやり方があると思いますが、僕はアプリの起動時にdb:migrateしてしまえばよいと思っています。今回移行したアプリはDBがなかったのでこの考慮は不要でした。