Ruby제 ServerlessFramework【Jets】를 Docker로 환경 구축

Jets


  • Ruby의 서버리스 프레임 워크
  • 명령으로 빌드 및 배포 가능
  • Rails와 같은 코드와 명령

  • 공식 페이지

    구성도 (공식 페이지에서 인용)


    환경 구축



  • 루비 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.yml , bin/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입니다.



    구현



    로컬로 간단한 샘플 이동



    공식 페이지의 빠른 시작 의 내용을 시험해 봅니다.

    실행중인 컨테이너에 들어갑니다.
    $ docker exec -it [コンテナのID] bash
    
    scaffold 를 사용하여 간단한 병아리를 만듭니다.
    $ jets generate scaffold Post title:string
    $ jets db:create db:migrate
    

    여기까지 실행하여 브라우저에서 http://localhost:8888/posts
    작성한 Post의 CRUD 화면이 표시되면 OK입니다.



    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입니다.

    나쁜 노하우



  • 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을 검토하십시오.

    참고 URL



  • Ruby가 만든 서버리스 프레임 워크의 Jets를 확인해 보았을 때 Rails Like에 사용할 수있는 좋은 느낌이었습니다.
  • 좋은 웹페이지 즐겨찾기