Open7

学習用のRailsコンテナ作成

まきのすけまきのすけ

やりたいこと

  • Ralis/Ruby 学習のため、ローカル環境に影響を与えず最新バージョンの Rails アプリケーションを新規作成、実行できるコンテナを作成する
  • コンテナ内で複数のRailsアプリケーションを作成し、実行できるようにする
まきのすけまきのすけ
.devcontainer/Dockerfile
FROM ruby

# 環境変数の取得
ARG ENV_USERNAME
ARG ENV_WORKDIR

# 環境の設定
ENV LANG C.UTF-8
ENV TZ Asia/Tokyo

# 必要なパッケージのインストール
RUN apt-get update -qq \
  && apt-get install -y nodejs postgresql-client

# ユーザの作成
RUN adduser --disabled-password --gecos "" ${ENV_USERNAME}

# ファイルのコピー
COPY . ${ENV_WORKDIR}
RUN chown -R ${ENV_USERNAME}:${ENV_USERNAME} ${ENV_WORKDIR}

# 作業ディレクトリ、ユーザを設定
WORKDIR ${ENV_WORKDIR}
USER ${ENV_USERNAME}

# Gem のアップデートとインストール
RUN gem update --system \
  && bundle install
まきのすけまきのすけ
.devcontainer/docker-compose.yml
services:
  db:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=pstgrsdb
      - TZ=Asia/Tokyo
    volumes:
      - db:/var/lib/postgresql/data:rw

  apps:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
      args:
        ENV_USERNAME: dev
        ENV_WORKDIR: /workspace
    volumes:
      - ..:/workspace:rw
    depends_on:
      - db
    command: /bin/sh -c "while :; do sleep 10; done"
    tty: true
    stdin_open: true

volumes:
  db:
まきのすけまきのすけ

一旦、開発コンテナはこんな感じに。
拡張機能、設定はおいおい調整。

.devcontainer/devcontainer.json
{
  "name": "Rails Tutorials",
  "dockerComposeFile": "docker-compose.yml",
  "service": "apps",
  "workspaceFolder": "/workspace",
  "customizations": {
    "vscode": {
      "extensions": [
        "misogi.ruby-rubocop",
        "formulahendry.auto-close-tag",
        "formulahendry.auto-rename-tag",
        "kaiwood.endwise",
        "shardulm94.trailing-spaces",
        "oderwat.indent-rainbow",
        "CraigMaslowski.erb",
        "castwide.solargraph",
        "bung87.rails",
        "Hridoy.rails-snippets",
        "sporto.rails-go-to-spec",
        "eamodio.gitlens",
        "Shopify.ruby-lsp"
      ],
      "settings": {
        "editor.formatOnSave": true,
        "ruby.rubocop.onSave": true,
        "emmet.includeLanguages": {
          "erb": "html"
        }
      },
      "postCreateCommand": "cd .ruby-lsp && bundle install"
    }
  }
}
  • コンテナ作成時に RubyLSP のGemをインストールする。
まきのすけまきのすけ

Railsアプリケーションの作成

rails new sample-app --database=postgresql --skip-test
  • PostgreSQL を使用する
  • テストファイルをスキップする
まきのすけまきのすけ

作成した Rails アプリケーションで bundle exec rails db:create をする際は以下の修正が必要

sample-app/config/database.yml
 default: &default
   adapter: postgresql
   encoding: unicode
   # For details on connection pooling, see Rails configuration guide
   # https://guides.rubyonrails.org/configuring.html#database-pooling
   pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+  username: postgres
+  password: pstgrsdb
+  host: db
+  port: 5432