Docker 및 docker-compose를 사용한 Rails API 모드 환경 구축

Docker와 docker-compose를 사용하여 Rails6을 API 모드로 움직이는 환경을 구축했습니다. 마지막으로 동작 확인도 하고 있습니다.

전제



Docker & docker-compose 설치됨

운영 환경


  • macOS Catalina 10.15.7
  • Ruby 2.7.1
  • Ruby on Rails 6.0.3
  • Docker 20.10.2
  • docker-compose 1.27.4


  • 디렉토리를 만듭니다.
    mkdir rails_api_docker
    cd rails_api_docker
    

    Gemfile과 Dockerfile을 만듭니다.

    Gemfile
    source 'https://rubygems.org'
    
    gem 'rails', '6.0.3'
    

    Dockerfile
    FROM ruby:2.7.1-alpine3.11
    
    ENV BUNDLER_VERSION=2.1.4
    
    WORKDIR /usr/src/app
    
    COPY Gemfile .
    COPY Gemfile.lock .
    
    RUN apk update && \
        apk add --no-cache \
        shared-mime-info \
        linux-headers \
        libxml2-dev \
        curl-dev \
        make \
        gcc \
        libc-dev \
        g++ \
        sqlite-dev \
        tzdata && \
        gem install bundler && \
        bundle install
    
    COPY . .
    
    EXPOSE 3000
    

    설치할 bundler 버전을 지정하기 위해 ENV에서 환경 변수를 정의했습니다.

    Dockerfile을 기반으로 Docker 이미지를 만듭니다.
    docker build -t rails_api:6.0.3 .
    

    작성한 이미지에서 컨테이너를 시작하고 Rails 애플리케이션을 작성하십시오.
    docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app rails_api:6.0.3 rails new . --skip-keeps -M -C -S -J -B
    


    옵션
    설명


    --skip-keeps
    .keep 파일을 만들지 않음

    -M
    Action Mailer, Action Mailbox, Action Text 관련 파일을 만들지 않음

    -C
    Action Cable 관련 파일을 만들지 않음

    -S
    Sprockets, Spring, listen을 사용하지 않음

    -J
    JavaScript, turbolinks 사용 안함

    -B
    bundle install을 실행하지 않음


    docker-compose.yml 를 작성합니다.

    docker-compose.yml
    version: '3'
    services: 
      api:
        build: .
        ports: 
          - '3000:3000'
        volumes: 
          - .:/usr/src/app
        tty: true
        command: ["rails", "server", "-b", "0.0.0.0"]
    


    docker-compose로 컨테이너를 시작합니다.
    docker-compose up
    
    localhost:3000 로 이동합니다. 시작 화면이 표시되면 성공입니다.


    API 동작 확인



    시작 중인 컨테이너에 로그인합니다.
    docker-compose exec api sh
    

    이번에는 간단하게하기 위해 scaffold를 사용하여 controller와 model을 만듭니다.
    rails g scaffold User name:string
    
    /db/seeds.rb 에 다음을 추가하여 테스트 데이터를 만듭니다.

    seeds.rb
    User.create name: "Euclid"
    


    DB를 초기화하고 테스트 데이터를 반영합니다.
    rails db:create
    rails db:migrate
    rails db:seed
    
    /app/controllers/users_controller.rb 의 index 액션을 다음으로 변경합니다.

    users_controller.rb
    def index
      @users = User.all
      render json: @users
    end
    
    localhost:3000/users 에 접속해 다음이 표시되면 성공입니다.



    읽어 주셔서 감사합니다! 지적이나 의견 등 있으면 댓글을 주시면 기쁩니다 🐳

    좋은 웹페이지 즐겨찾기