Docker로 Rails6 환경을 구축하는 방법

소개



Docker로 Rail6 환경을 구축하는 방법을 소개합니다.
Rails6에서 Webpack이 도입되었고 Rails5와 약간의 절차가 다르기 때문에 거기도 고려했습니다.

Docker 공식 페이지 Quickstart: Compose and Rails

환경



Docker3
Rails6.0.3
Ruby2.7.1
DB:PostgeSQL

1. 필요한 파일 만들기



이번에는 "myapp"라는 폴더에 환경을 구축합니다.
이름을 바꾸는 경우는 이후, "myapp"를 적절히 변경해 주세요.

지금부터 작성하는 파일 구성은 아래와 같습니다.

파일 구성
myapp
  --Dockerfile
  --Gemfile
  --Gemfile.lock
  --entrypoint.sh
  --docker-compose.yml

먼저 폴더를 만듭니다.

터미널
$ mkdir myapp
$ cd myapp

1.1 Dockerfile



터미널
$ touch Dockerfile

Dockerfile
FROM ruby:2.7.1
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

## nodejsとyarnはwebpackをインストールする際に必要
# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn

# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
apt-get install nodejs

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

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

1.2 Gemfile



터미널
$ touch Gemfile

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'

1.3 Gemfile.lock



터미널
$ touch Gemfile.lock

여기에는 아무것도 기재하지 않습니다.

1.4 원 try 포인트. sh



터미널
$ touch entrypoint.sh

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

1.5 docker-compose.yml



터미널
$ touch docker-compose.yml

docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data

    #######追加#########################
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust'
    ###################################

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

2. 프로젝트 빌드



2.1 rails new



터미널
$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundle

명령 옵션 정보--force : 파일이 존재해도 덮어쓰기--no-deps : 링크된 서비스를 시작하지 않음--database=postgresql :DB는 PostgreSQL을 지정--skip-bundle :bundle install은 건너뜁니다.

2.2 docker-compose build



새롭게 Gemfile이 작성되었으므로, bundle install하기 위해서 이하의 커멘드 사용합니다.

터미널
$ docker-compose build

2.3 DB에 대한 연결 설정 변경



config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  #####追加#####
  host: db
  username: postgres
  passowrd:
  #############

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

2.4 Docker 컨테이너 시작 확인



터미널
$ docker-compose up

컨테이너가 시작되어 서버에 연결되면 OK입니다.
아직 DB를 작성하지 않았으므로 다음과 같은 오류가 발생합니다.


2.5 DB 생성



서버에는 접속할 수 있었으므로 나머지는 DB 작성입니다.
Ctrl+C로 연결을 끊은 후,

터미널
  #一度Dockerをストップさせる
$ docker-compose stop
$ docker-compose down

  #DB作成
$ docker-compose run web rake db:create

  #再度Dockerを立ち上げる
$ docker-compose up

3. 컨테이너 & 서버가 시작되었는지 확인



http://localhost:3000/ 에 접속하면 무사히 기동하고 있는 것을 확인할 수 있습니다.
버전은 설정한 것처럼 Rails6, Ruby2.7.1입니다.


기타



Docker 내에서 개발할 때는 Docker 명령을 사용해야 합니다.
$ docker-compose run web bundle exec rails コマンド

$ docker-compose run web bundle exec rails g model User
$ docker-compose run web bundle exec rails g controller Homepages index
$ docker-compose run web bundle exec rails g rspec:install 

참고



Docker 공식 페이지 Quickstart: Compose and Rails
Docker로 Ruby on Rails의 환경 구축을 실시하기 위한 스텝【Rails 6 대응】
Rails6의 개발 환경을 Docker로 구축하려고하면 도하마한 건
Postgres의 DockerImage에 변경 사항이있어 시작할 수 없게 된 이야기
[Rails] ActiveRecord::NoDatabaseError [Docker]

좋은 웹페이지 즐겨찾기