バイセル Tech Blog

バイセル Tech Blogは株式会社BuySell Technologiesのエンジニア達が知見・発見を共有する技術ブログです。

バイセル Tech Blog

docker-composeを使用したRuby on Jetsの構築からデプロイまで①

概要

こんにちは、バイセルテクノロジーズ新卒エンジニアの長兵衛です。

以前紹介したRuby on Jetsのdocker-composeを使用した環境構築をこの記事で、デプロイまでを次の記事で、という段取りで書きたいと思います。

tech.buysell-technologies.com

Ruby on Jetsはrailsライクなフレームワークです。

ローカルではrailsの様にpumaを立ち上げることができます。

実行環境

docker 19.03.13

docker-compose 1.27.4

ruby 2.5.7

Ruby on Jets 2.0.6

postgresql 11.6

ローカル環境の作成

Dockerfile・docker-compose.yml・Gemfileの作成

  • Dockerfile
FROM ruby:2.5.7

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - &&\\
    apt-get update -qq &&\\
    apt-get install -y build-essential nodejs postgresql-client graphviz task-japanese fonts-ipafont fonts-noto-cjk &&\\
    apt-get -y install rsync &&\\
    apt-get -y install zip

ENV LANG ja_JP.UTF-8

ENV TZ=Asia/Tokyo

RUN curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip | bash - &&\\
    unzip awscliv2.zip &&\\
    ./aws/install

WORKDIR /usr/src/app
COPY Gemfile .
COPY Gemfile.lock .
RUN bundle install

CMD ["/bin/sh"]

rsyncとawscliを使用しています。過不足があったらすみません。。

  • docker-compose.yml
version: '3'
volumes:
  bundle:
  postgres:
services:
  app:
    build: .
    ports:
      - 3000:3000
    volumes:
      - bundle:/usr/local/bundle
      - .:/usr/src/app:delegated
      - ~/.aws:/root/.aws
    depends_on:
      - postgres
    links:
      - postgres
    stdin_open: true
    tty: true
    env_file:
      - .env.container
    command: /bin/sh -c "bundle exec jets server --host '0.0.0.0' --port '3000'"
  postgres:
    image: postgres:11.6-alpine
    ports:
      - 5432:5432
    volumes:
      - postgres:/var/lib/postgresql/data

jets server でpumaを起動できます。

環境変数管理用ファイルは明示的に.env.containerという名前にしました。

理由はdockerコンテナ内の環境変数とアプリケーション内の環境変数を分かりやすく区別したかったからです。

また、ここで鬼門だったのがawsのcredentialをどこに持つかです。

今回はcredentialファイルをvolumeでマウントしました。

推奨ではないらしいのですが。。CIでは暗号化されたキーをパイプライン上で復号すれば問題ないと思います。

注意点としてはこちらの方法はローカルの~/.awsにデプロイ用ユーザのcredentialを用いる前提としていることです。

どういうことかというと、既に~/.awsに存在しているユーザ情報を用いてデプロイすることになってしまうのでデプロイに必要なIAMポリシーをそのユーザに付与することになります。

都合が悪ければデプロイ用ユーザを新たに作り、そのcredentialファイルをappコンテナにマウントしてください。

app:
  volumes:
    - <credentialがあるパス>:/root/.aws
  • Gemfile

とりあえずはこれだけでOKです。

source 'https://rubygems.org'
git_source(:github) do |repo| "https://github.com/#{repo}.git" end

gem 'jets'

空のGemfile.lockと.env.containerを作成します。

$ touch Gemfile.lock
$ touch .env.container

jetsプロジェクトを作成

$ docker-compose build
$ docker-compose run --rm app jets new . --database=postgresql --mode=api

以下を参考に上記のコマンドを叩きました。

https://rubyonjets.com/reference/jets-new/

https://rubyonjets.com/docs/new-modes/

今回はapiモードで作成します。

 

ここでGemfileを上書きしていいか聞いてきます。

yを入力しましょう。後からカスタマイズしてください。

conflict  Gemfile
Overwrite /usr/src/app/Gemfile? (enter "h" for help) [Ynaqdhm]
# y押してenter

Gemfileが更新されたので、再びbundle installをします。

$ docker-compose run --rm app bundle install

db作成

.env.containerに環境変数を記述します。今回はDB情報を記述します。

DB_NAME=hoge
DB_HOST=fuga
DB_USER=hogehoge
DB_PASS=fugafuga
POSTGRES_HOST_AUTH_METHOD=trust

db:createを実行。

$ docker-compose run --rm app bundle exec jets db:create

scaffoldでとりあえずひな形を作成。

$ docker-compose run --rm app bundle exec jets g scaffold post title:string

This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION. invoke active_record create db/migrate/20200927064200_create_posts.rb create app/models/post.rb invoke resource_route route resources :posts Deprecation warning: Expected string default value for '--test-framework'; got false (boolean). This will be rejected in the future unless you explicitly pass the options `check_default_type: false` or call `allow_incompatible_default_type!` in your code You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION. invoke scaffold_controller create app/controllers/posts_controller.rb

db:migrateを実行。

$ docker-compose run --rm app bundle exec jets db:migrate

コンテナを立ち上げてみる

$ docker-compose up

これでjets serverが実行されてローカルサーバが立ち上がります。

http://0.0.0.0:3000でブラウザ確認ができたら、OKです。

f:id:bst-tech:20201205182032p:plain

何故かrubyのversionが2.5.3になってますが、まあ良いでしょう..w

まとめ

今回はローカルでアプリケーションサーバが立ち上がるところまで確認でき、開発できる環境ができました。

次回はデプロイ用のIAMポリシーの設定からデプロイ、stag,prod環境の作成方法などを書きたいと思います。

バイセルテクノロジーズではエンジニアを募集しています。

ご興味のある方は是非ご応募ください。

herp.careers

参考

GitHub - boltops-tools/jets: Ruby on Jets

Overview - Jets Ruby Serverless Framework