【Docker로 환경 구축】Rails 6 & MySQL 8

1. 소개



Rails로 새롭게 어플리케이션을 만들어 보려고 생각해 환경 구축을 했으므로, 비망록용의 기사입니다.
엔지니어 경력 & Rails 경력이 1년 미만이므로, 실수나 보다 끈적한 쓰기가 있으면 지적해 주십시오.

운영 환경


  • macOS Catalina 10.15.7
  • Ruby 2.7.2
  • Rails 6.0.3
  • MySQL 8.0.20
  • Docker 19.03.13
  • docker-compose 1.27.4

  • 2. 필요한 파일 준비



    우선은 임의의 디렉토리를 작성해, 파일을 작성합니다.
    mkdir rails_app
    cd rails_app
    
    # 複数ファイルを一気に作成します
    touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh,.env}
    

    Dockerfile



    Dockerfile
    FROM ruby:2.7.2
    
    ENV LANG C.UTF-8
    ENV APP_ROOT /app
    
    # install required libraries
    RUN 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 -qq && \
      apt-get install -y --no-install-recommends \
      build-essential \
      nodejs \
      yarn && \
      apt-get clean && \
      rm --recursive --force /var/lib/apt/lists/*
    
    # create working directory
    RUN mkdir $APP_ROOT
    WORKDIR $APP_ROOT
    
    # bundle install
    COPY Gemfile $APP_ROOT/Gemfile
    COPY Gemfile.lock $APP_ROOT/Gemfile.lock
    RUN bundle install --jobs 4 --retry 3
    
    # create app in container
    COPY . $APP_ROOT
    
    # 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"]
    

    docker-compose.yml



    docker-compose.yml
    version: '3.7'
    services:
      db:
        image: mysql:8.0.20
        volumes:
          - mysql:/var/lib/mysql:delegated
        ports:
          - '3307:3306'
        command: --default-authentication-plugin=mysql_native_password
        env_file: .env
    
      web:
        build:
          context: .
          dockerfile: Dockerfile
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        tty: true
        stdin_open: true
        env_file: .env
        depends_on:
          - db
        ports:
          - '3000:3000'
        volumes:
          - .:/app:cached
          - bundle:/usr/local/bundle:delegated
          - node_modules:/app/node_modules
          - tmp-data:/app/tmp/sockets
    
    volumes:
      mysql:
      bundle:
      node_modules:
      tmp-data:
    

    .env



    .env
    MYSQL_ROOT_PASSWORD=password
    TZ=Japan
    

    Gemfile



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

    Gemfile.lock



    Gemfile.lock
    # 空のままでOK
    

    원 트리 포인트 t. 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 "$@"
    

    3. Rails 프로젝트 만들기



    필요한 파일을 만들었으면 rails new 명령을 실행합니다.
    docker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test
    docker-compose run --rm web bin/rails webpacker:install
    

    옵션은 자유롭게 붙이면 좋다고 생각합니다만, 여기에서 여러가지 지정해 두면 편합니다.

    4. database.yml 편집



    database.yml
    default: &default
      adapter: mysql2
      encoding: utf8mb4
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: <%= ENV.fetch('MYSQL_USERNAME') { 'root' } %>
      password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %>
      host: <%= ENV.fetch('MYSQL_HOST') { 'db' } %>
    
    development:
      <<: *default
      database: rails_app_dev
    
    test:
      <<: *default
      database: rails_app_test
    
    production:
      <<: *default
      database: rails_app_prd
      username: app
      password: hoge
    
    docker-compose.yml 로 설정한 정보로 액세스 할 수 있도록 password 등의 기술을 실시합니다.
    host는 db 컨테이너입니다.

    5. Docker 이미지를 빌드하고 DB 생성


    docker-compose build
    docker-compose run web bin/rails db:create
    

    6. Yay! You’re on Rails!


    docker-compose up -d
    

    컨테이너를 시작하고 Rails의 초기 화면이 표시되면 완성입니다.


    참고


  • 【Rails】Rails 6.0 x Docker x MySQL로 환경 구축
  • 참여중인 프로젝트 외
  • 좋은 웹페이지 즐겨찾기