Open7
学習用のRailsコンテナ作成
やりたいこと
- Ralis/Ruby 学習のため、ローカル環境に影響を与えず最新バージョンの Rails アプリケーションを新規作成、実行できるコンテナを作成する
- コンテナ内で複数のRailsアプリケーションを作成し、実行できるようにする
リポジトリの作成 tut-rails-workspace
.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