Docker를 통한 Hanami(구명 Lootus) 개발 환경 구축

7294 단어 LotusDockerRubyhanami

개시하다


루비의 프레임 하면 라일스 느낌이 나지만 다른 프레임도 쓰고 싶고, 닥터커 환경 구축과 관련된 기사는 기본적으로 라일스를 전제로 한 것이기 때문에 이번에는 하나미로 환경을 구축하려 했다.
Dockerfile,docker-compose.나는 yml의 내용과 업무는 Rails 때와 별 차이가 없다고 생각한다.

하나미의 특징

  • 이전 이름이 Lotus인 웹 프레임워크
  • Giithub의 Star 수는 3500 미만(2016년 12월 기준)
  • apps 이하는 앱 단위로 분리돼 관리화면과 API 등을 독립적으로 제작할 수 있다(프로젝트 제작 시 홈페이지는 1개 상태)
    $ tree apps
    apps
    └── web
        ├── application.rb
        ├── assets
        │   ├── favicon.ico
        │   ├── images
        │   ├── javascripts
        │   └── stylesheets
        ├── config
        │   └── routes.rb
        ├── controllers
        ├── templates
        │   └── application.html.erb
        └── views
            └── application_layout.rb
    
    하나의 응용 프로그램 안에 다음과 같은 구조가 있다
    컨트롤러는 디렉터리 이름으로 동작에 따라 파일로 나뉜다.
    ├── application.rb
    ├── assets
    │   ├── favicon.ico
    │   ├── images
    │   ├── javascripts
    │   └── stylesheets
    ├── config
    │   └── routes.rb
    ├── controllers
    │   ├── books
    │   │   └── index.rb
    │   └── home
    │       └── index.rb
    ├── templates
    │   ├── application.html.erb
    │   ├── books
    │   │   └── index.html.erb
    │   └── home
    │       └── index.html.erb
    └── views
        ├── application_layout.rb
        ├── books
        │   └── index.rb
        └── home
            └── index.rb
    

    컨디션

  • Mac OSX 10.12.1
  • 작성된 개발 환경

  • Ruby 2.3.1
  • 하나미(Ruby 프레임워크)
  • PostgreSQL 9.6
  • 차리다


    설치Docker for Mac

    환경 구조


    프로젝트 디렉터리에 다음 파일을 만듭니다.
    $ mkdir app
    $ cd app
    
    Gemfile
    source 'https://rubygems.org'
    
    gem 'hanami', '~> 0.9'
    

    Dockerfile


    APP_HOME에서 지정한 디렉터리 이름은 hanami new . 프로젝트를 만들 때의 프로젝트 이름입니다.
    Dockerfile
    FROM ruby:2.3.1
    ENV LANG C.UTF-8
    
    RUN gem install bundler
    
    ENV APP_HOME /app
    RUN mkdir $APP_HOME
    WORKDIR $APP_HOME
    
    ADD Gemfile* $APP_HOME/
    RUN echo 'gem: --no-document' > ~/.gemrc \
        && bundle install
    ADD . $APP_HOME
    

    docker-compose.yml


    하나미로 프로젝트를 하면 개발자와 테스트(자동 테스트용)로 DB를 두 개 만든다.env를 만들었기 때문에 그것에 따라 두 개의 DB 용기를 만들었고 개발자만 영원히 지속됩니다.
    컨테이너 1개에 DB 2개를 만드는 게 좋을 것 같은데 어떻게 해야 할지 모르겠어요...
    docker-compose.yml
    version: '2'
    services:
      web:
        build: .
        command: 'bundle exec hanami server --host 0.0.0.0 -p 2300'
        ports:
          - 2300:2300
        volumes:
                #DockerfileのAPP_NAMEに指定したもの
          - .:/app
        links:
          - db
          - db2
        environment:
          - DATABASE_URL=postgres://dev:dev@db:5432/dev
      db:
        image: 'postgres:9.6'
        volumes:
          - ./db/postgres_data:/var/lib/postgresql/data
        # PG CommanderなどのクライアントからDB接続するためのポート設定
        ports:
          - 5432:5432
        environment:
          - POSTGRES_USER=dev
          - POSTGRES_PASSWORD=dev
      db2:
        image: 'postgres:9.6'
        environment:
          - POSTGRES_USER=test
          - POSTGRES_PASSWORD=test
    

    프로젝트 작성

    $ docker-compose run web bundle exec hanami new . --database=postgresql
    
    Gemfile이 덮어쓰여지지 않느냐는 질문에 Y로 덮어씁니다.
    프로젝트 작성 후 상태는 다음과 같습니다.
    $ tree -L 1
    .
    ├── Dockerfile
    ├── Gemfile
    ├── Gemfile.lock
    ├── Rakefile
    ├── apps
    ├── config
    ├── config.ru
    ├── db
    ├── docker-compose.yml
    ├── lib
    ├── public
    └── spec
    

    DB 설정 변경

    .env.development.env.test에 사용된 DB의 설정이 docker-compose에 기록되었습니다.yml 설정을 덮어쓰기 때문에 삭제합니다.
    .env.development
    # Define ENV variables for development environment
    DATABASE_URL="postgres://localhost/app_development" # この行を削除
    SERVE_STATIC_ASSETS="true"
    WEB_SESSIONS_SECRET="xxxx"
    

    용기 가동, 화면 표시 확인

    $ docker-compose build web
    $ docker-compose up web
    
    localhost: 2300에 로그인해서 기본 화면 표시를 확인하면 됩니다.

    마이그레이션 및 테스트 실행 등


    라크 작업과 하나미의 명령 수행도 프로젝트 제작과 마찬가지로 docker-compose run을 이용한다.
    $ docker-compose run web bundle exec hanami generate migration create_books
    $ docker-compose run web bundle exec hanami db migrate
    

    DB 컨텐츠 확인


    Rails의dbconcel처럼 Hanami도 명령선을 통해 DB 연결을 할 수 있지만 웹 용기에 PostgreSQL이 설치되어 있지 않아 잘못 연결할 수 없습니다.
    $ docker-compose run web bundle exec hanami db console
    bundler: failed to load command: hanami (/usr/local/bundle/bin/hanami)
    Errno::ENOENT: No such file or directory - psql
    
    docker-compose로 DB의 용기를 분리해서 관리하고 싶지 않지만 웹에 넣고 싶지 않아서 클라이언트로 연결하기로 했습니다.
    여기서 사용하는 것은 PG Commander입니다.
    Port, User, Password, Database는 docker-compose입니다.yml 설정에 따라 입력합니다.

    이상은 기본 홈페이지 디스플레이와 DB의 준비 작업입니다. 개발 작업에 들어갈 수 있을 것 같습니다.

    참고 자료


    Hanami 공식 문서
    Hanami(레거시: Lotus) - Microservices용 루비 프레임워크

    좋은 웹페이지 즐겨찾기