LoginSignup
10
1

More than 5 years have passed since last update.

Ruby製ServerlessFramework【Jets】をDockerで環境構築

Posted at

Jets

  • Ruby 製のサーバーレスフレームワーク
  • コマンドでビルド&デプロイが可能
  • Railsライクなコードやコマンド

公式ページ

構成図 (公式ページから引用)
image.png

:computer:環境構築


  • ruby 2.5.1
  • Docker Desktop 2.0.0.2
  • Mac 10.14.2

プロジェクト作成


まずはJets自体をインストールしてプロジェクトを作成する所までを行います。
Dockerを使ってコンテナ内にプロジェクトを構築して行きます。

Dockerfileを以下のように作成。

FROM ruby:2.5.1

WORKDIR /usr/src/app

# For Node.js
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -

RUN apt-get update && \
    apt-get install -y \
      mysql-client \
      nodejs \
      build-essential \
      vim \
      zip \
      unzip \
      --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

# Install yarn
RUN curl -o- -L https://yarnpkg.com/install.sh | bash
ENV PATH="/root/.yarn/bin:$PATH"
ENV LANG=ja_JP.UTF-8

RUN gem install jets

Docker Buildして jets new [プロジェクト名] コマンドでプロジェクトを作成します。

$ docker build -t jets/sample .
$ docker run --rm -v `pwd`:/usr/src/app -t jets/sample jets new myapp

これでプロジェクトが作成出来たので、使用したDockerfileは一旦削除します。

起動してトップ画面表示まで


作成したプロジェクト配下に 新しいDockerfiledocker-compose.ymlbin/start_server.sh を追加します。

FROM ruby:2.5.1

WORKDIR /usr/src/app

# For Node.js
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -

RUN apt-get update && \
    apt-get install -y \
      mysql-client \
      nodejs \
      build-essential \
      vim \
      zip \
      unzip \
      rsync \
      --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

# Install yarn
RUN curl -o- -L https://yarnpkg.com/install.sh | bash
ENV PATH="/root/.yarn/bin:$PATH"
ENV LANG=ja_JP.UTF-8

ADD Gemfile /usr/src/app/
ADD Gemfile.lock /usr/src/app/
RUN bundle install --system

ADD . /usr/src/app

RUN jets webpacker:install

EXPOSE 8888
CMD bin/start_server.sh
docker-compose.yml
version: '3'
volumes:
  gem_data:
    driver: local
  db_data:
    driver: local

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    environment:
      DB_HOST: db
      BUNDLE_JOBS: 4
      BUNDLE_PATH: /usr/local/bundle
    ports:
      - '8888:8888'
    volumes:
      - .:/usr/src/app
      - gem_data:/usr/local/bundle
    command:
      bin/start_server.sh
    depends_on:
      - db

  db:
    image: mysql:5.6
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    ports:
      - '3306:3306'
    volumes:
      - db_data:/var/lib/mysql
bin/start_server.sh
#!/bin/bash
set -e
source ~/.bashrc

bundle exec jets db:create db:migrate
bundle exec jets server --host 0.0.0.0

ここまでで一度 docker-compose up します。
http://localhost:8888 にブラウザでアクセスして下の画面が表示されればOKです。

2.png

:pencil: 実装


ローカルで簡単なサンプルを動かす

公式ページのQuick Startの内容を試してみます。

起動しているコンテナ内に入ります。

$ docker exec -it [コンテナのID] bash

scaffoldを使って簡単な雛形を作成します。

$ jets generate scaffold Post title:string
$ jets db:create db:migrate

ここまで実行して、http://localhost:8888/posts にブラウザでアクセスして
作成したPostのCRUD画面が表示されてればOKです。

3.png

AWS環境へデプロイ

再度コンテナ内に入って、AWSのシークレットキー設定を行います。

$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXX

設定できたら早速デプロイしてみます。

$ jets deploy
Stack success status: UPDATE_COMPLETE
Time took for stack deployment: 2m 35s.
Prewarming application.
API Gateway Endpoint: https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/

最後に出力されるAPI GatewayのURLにアクセスしトップ画面が表示されればOKです。

:bomb: バッドノウハウ


  • docker外から http://localhost:8888 へアクセス出来ない。

--host 0.0.0.0 を指定して実行する

start_server.sh
jets server --host 0.0.0.0

  • デプロイ時に以下のエラーが出る。
/usr/local/bundle/gems/jets-1.6.4/lib/jets/builders/code_builder.rb:37:in `chdir': No such file or directory @ dir_chdir - /tmp/jets/app/stage/code (Errno::ENOENT)

または、

rsync -a --links /tmp/jets/app/stage/code/vendor/gems/ruby/2.5.0/ /tmp/jets/app/stage/opt/ruby/gems/2.5.0/ failed to run.

-> どちらも rsync がインストールされていないのでDockerfileを見直す。

:link: 参考URL


10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1