koukiblog

たぶんweb系の話題

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がなかったのでこの考慮は不要でした。