Docker로 Rails6 환경 만들기

8808 단어 도커RubyonRails6.0
Docker에서 Rails6 환경을 만들 때의 메모.
상용으로 사용하는 것은 아니고, development 환경에서 밖에 사용하지 않기 때문에, 여러가지 부족할지도 모른다.
환경은 WSL2이며 사전에 ruby2.7.2, docker 및 docker-compose를 설치했습니다.
Docker 공식 페이지 에 있는 entrypoint.sh 는 사용하지 않는다.
그리고 개인적인 취향으로 Docker Compose를 사용한다.

파일 준비


준비는 다음 4가지 파일

Dockerfile


apt-key 는 곧 사용할 수 없게 되지만, 지금은 신경쓰지 않는다.
nodejs 의 디폴트의 버젼이 10.x 입니다만, 이것이라면 이후의 Webpack 의 컴파일로 실패하는 모양.
따라서 추가로 14.x를 설치합니다.

Dockerfile
FROM ruby:2.7.2

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -\
    && echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

RUN apt update -qq && apt install -y build-essential postgresql-client yarn \
    curl dirmngr apt-transport-https lsb-release ca-certificates
RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -

ENV APP_ROOT /app
RUN mkdir ${APP_ROOT}
WORKDIR ${APP_ROOT}
ADD ./Gemfile ${APP_ROOT}/Gemfile
ADD ./Gemfile.lock ${APP_ROOT}/Gemfile.lock

RUN bundle install

ADD . ${APP_ROOT}

Gemfile



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

Gemfile.lock


빈 파일을 만듭니다.

Gemfile.lock

docker-compose.yml

docker-compose.yml
version: '3'
services:
  db:
    image: postgres:13.4
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
  web:
    build: .
    environment:
      RAILS_ENV: development
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - '3000:3000'
    depends_on:
      - db

Rails 앱 만들기

$ docker-compose build
$ docker-compose run --rm --no-deps web rails new . --force --database=postgresql

권한 재기록

私の場合、Dockerグループの設定などをしていないので、 rails new でファイルを作ると全部 root 権限になってしまう。
そこで sudo chown -R でファイルの所有者を自分に書き換えている。

$ sudo chown -R me.me *

Rails 설정

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db           # 追加(docker-compose.ymlのserviceに設定したのと同じ名前にする)
  username: postgres # 追加(docker-compose.ymlのPOSTGRES_USERに設定したのと同じ値にする)
  password: postgres # 追加(docker-compose.ymlのPOSTGRES_PASSWORDに設定したのと同じ値にする)
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

host, username, password の 3 行を追加する。username と password は docker-compose.yml で設定したものと合わせる。
いつ頃からか password を設定しないと怒られるようになった。

DB 생성

$ docker-compose run --rm web rake db:create

시작

$ docker-compose up

DB 마이그레이션

Scaffold

$ docker-compose run --rm web rails g scaffold User name:string height:integer weight:integer

ここでも出来るファイルは root 権限になってしまうので、sudo chown -R でファイルの所有者を自分に書き換える。

Migration

$ docker-compose run --rm web rake db:migrate

Permission denied 오류가 발생하면

db_1   | 2021-08-22 10:35:11.953 UTC [31] WARNING:  could not open statistics file "pg_stat_tmp/global.stat": Permission denied

みたいな感じで Permission denied のエラーが出ることがある。
そのときは sudo chown -R me.me * で権限を自分に書き換える。
めんどうなのですべてのファイルの権限を書き換えている。

OCI runtime create failed 오류가 발생하면

ERROR: for rails_db_1  Cannot start service db: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting "/run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu-20.04/b90b8fe5c1b58941ad8f1d946593e332a8ad2a209d955b5b9babc4dea8a62ea9" to rootfs at "/var/lib/postgresql/data" caused: mount through procfd: no such file or directory: unknown

理由は分からないがこのエラーが出たら WSL を再起動すると直るようだ。

Webpacker::Manifest::MissingEntryError가 나오면

Webpacker::Manifest::MissingEntryError in Users#index같은 에러가 나왔을 때에 다음을 하면 고친다.

$ docker-compose run --rm web rake webpacker:install
$ docker-compose run --rm web rake webpacker:compile

Rails7의 환경도 만들었다

좋은 웹페이지 즐겨찾기