高木のブログ

Docker ComposeでRuby on Jetsの開発環境を構築する

2020/03/29

Docker Composeを利用して、Ruby on Jetsの開発環境を構築してみる。
細かい設定はいろいろあるけど、とりあえず最低限のJetsの画面が表示される状態をゴールとする。

そもそもRuby on Jetsとは?
サーバーレスアプリケーションをRailsライクに作成できるRuby製のサーバーレスフレームワークのこと。 AWSへのデプロイも簡単らしい。
https://rubyonjets.com/

バージョン

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G11023

$ docker --version
Docker version 19.03.5, build 633a0ea

$ docker-compose --version
docker-compose version 1.25.4, build 8d51620a

手順

プロジェクトのディレクトリを作って移動

mkdir sample_jets_app
cd sample_jets_app

Dockerfileを作成

$ vim Dockerfile
FROM ruby:2.5

RUN apt-get update -qq && apt-get install -y nodejs yarnpkg mariadb-client
RUN ln -s /usr/bin/yarnpkg /usr/bin/yarn

RUN mkdir /sample_jets_app
WORKDIR /sample_jets_app
COPY Gemfile /sample_jets_app/Gemfile
COPY Gemfile.lock /sample_jets_app/Gemfile.lock
RUN bundle install
COPY . /sample_jets_app

CMD ["jets", "server", "--port", "3000", "--host", "0.0.0.0"]

Gemfileを作成

$ vim Gemfile
source 'https://rubygems.org'
gem 'jets'

空のGemfile.lockを作成

$ touch Gemfile.lock

docker-compose.ymlを作成

$ vim docker-compose.yml
version: '3'
services:
  web:
    build: .
    command: bash -c "bundle exec jets server --port 3000 --host 0.0.0.0"
    volumes:
      - .:/sample_jets_app
      - bundle_vol:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    volumes:
      - mysql_vol:/var/lib/mysql
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=1
volumes:
  bundle_vol:
    driver: local
  mysql_vol:
    driver: local

Jetsアプリケーションを作成

$ docker-compose run web jets new . --force --no-deps --database=mysql
$ docker-compose run web jets new . --force --no-deps --database=mysql
Creating network "sample_jets_app_default" with the default driver
Creating volume "sample_jets_app_bundle_vol" with local driver
Creating volume "sample_jets_app_mysql_vol" with local driver
Creating sample_jets_app_db_1 ... done
Building web
Step 1/10 : FROM ruby:2.5
 ---> 5a76bd71024b

省略...

Done in 138.88s.
================================================================
Congrats 🎉 You have successfully created a Jets project.

Cd into the project directory:
  cd .

To start a server and test locally:
  jets server # localhost:8888 should have the Jets welcome page

Scaffold example:
  jets generate scaffold post title:string body:text published:boolean
  jets db:create db:migrate

To deploy to AWS Lambda, edit your .env.development.remote and add a DATABASE_URL endpoint.
Then run:

  jets deploy

Jetsアプリケーションに必要なファイルが生成されている

$ ls
Dockerfile              README.md               bin                     docker-compose.yml      public
Gemfile                 Rakefile                config                  node_modules            spec
Gemfile.lock            app                     config.ru               package.json            yarn.lock
Procfile                babel.config.js         db                      postcss.config.js

このままだとDBに接続できないので、config/database.ymlを編集

$ vim config/database.yml
 default: &default
   adapter: mysql2
   encoding: utf8mb4
   pool: <%= ENV["DB_POOL"] || 5  %>
   database: <%= ENV['DB_NAME'] || 'sample_jets_app_development' %>
   username: <%= ENV['DB_USER'] || 'root' %>
   password: <%= ENV['DB_PASS'] %>
-  host: <%= ENV["DB_HOST"] %>
+  host: <%= ENV["DB_HOST"] || 'db' %>
   url: <%= ENV['DATABASE_URL'] %> # takes higher precedence than other settings
   reconnect: true

 development:
   <<: *default
   database: <%= ENV['DB_NAME'] || 'sample_jets_app_development' %>

 test:
   <<: *default
   database: sample_jets_app_test

 production:
   <<: *default
   database: sample_jets_app_production
   url: <%= ENV['DATABASE_URL'] %>

Gemfileに変更があったので、buildする

$ docker-compose build

アプリケーションを起動

$ docker-compose up

http://localhost:3000にアクセスして、JetsのWelcome画面が表示されたらOK Alt text here

よく使うコマンド例

$ docker-compose run web bundle exec jets console
$ docker-compose run web bundle exec jets db:create
$ docker-compose run web bundle exec jets db:migrate
$ docker-compose run web bundle exec jets db
$ docker-compose run web bundle exec jets generate controller home index

参考

https://docs.docker.com/compose/rails/

次回

簡単なページを作って、AWSにデプロイできたらいいな


Pixela