はじめに
本稿では使用している技術の説明は行いません。
各自で調べてください。
対象者
Docker、linux、devcontainerの基礎知識がある方
急ぎでRailsをWebアプリケーションとしてサクッと構築したい方
最小設定内容を知りたい方
ファイル作成
以下の構成となるようにファイルを作成してください。
project root
└── .devcontainer
├── infra
│ ├── ruby
│ │ └── Dockerfile
│ └── mysql
│ └── 1_ddl.sql
├── .env
├── docker-compose.yml
├── devcontainer.json
└── Taskfile.yml
ファイル作成
container/ruby/Dockerfile
FROM ruby:3.4-bookworm
ENV TZ=Asia/Tokyo
ENV APP_ROOT /myapp
WORKDIR $APP_ROOT
# 必要なパッケージのインストール
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarn
# Task Runner のインストール
RUN curl -sL "https://github.com/go-task/task/releases/download/v3.9.0/task_linux_amd64.deb" -o task.deb && dpkg -i task.deb && rm task.deb
# ブランチ名がbashで表示されるようにカスタマイズ
COPY ../.bashrc /root/.bashrc
# keychainでgitのSSHキーを扱えるようにする。
RUN apt-get update && apt-get install -y keychain
# アプリ全体をコピー
COPY . .
# ポートを指定
EXPOSE 3000
# 以下3つはrailsをインストールしたらコメントアウトを解除してください。
# 必要ファイルをコピー
# COPY ../Gemfile ../Gemfile.lock ./
# Gemインストール
# RUN bundle install
# デフォルトコマンド
# CMD ["bash", "-c", "rm -f tmp/pids/server.pid && bundle exec rails server -b 0.0.0.0 -p ${APP_PORT}"]
.env
# 環境情報
# 語群はci dev stg prod
APP=dev
# アプリケーション設定
APP_NAME="Rails base"
APP_PORT=8086
# DB周り
MYSQL_USER=user
MYSQL_PASSWORD=password
DB_PORT=3308
MYSQL_DATABASE=development
docker-compose.yml
version: "3"
services:
app:
build:
context: ../
dockerfile: .devcontainer/infra/ruby/Dockerfile
env_file:
- .env
tty: true
ports:
- ${APP_PORT}:${APP_PORT}
volumes:
- ../:/myapp
- ~/.gitconfig:/myapp/.gitconfig
mysql:
image: mysql:8.0
ports:
- ${DB_PORT}:3306
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ../.devcontainer/infra/mysql/:/docker-entrypoint-initdb.d/
- db-data:/var/lib/mysql
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
volumes:
db-data:
driver: local
devcontainer.json
{
"name": "Rails Base DevContainer",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/myapp",
"postCreateCommand": "task setup",
"customizations": {
"vscode": {
"extensions": [
"editorconfig.editorconfig", // エディタを跨いだ共通設定ファイルをVsCodeで実行するのに必要
"ms-azuretools.vscode-docker", // VsCodeでのIntelliSenseやタブ補完用
"saoudrizwan.claude-dev" // AIコーディングサポート
]
}
}
}
1_ddl.sql
CREATE SCHEMA IF NOT EXISTS `development` DEFAULT CHARACTER SET utf8mb4 ;
CREATE SCHEMA IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8mb4 ;
-- 'user'@'%' が未作成の場合、ユーザーを作成
CREATE USER IF NOT EXISTS 'user'@'%' IDENTIFIED BY 'password';
-- 'user'@'%' に対して `test` データベースの全権限を付与
GRANT ALL PRIVILEGES ON `test`.* TO 'user'@'%';
FLUSH PRIVILEGES;
-- セッションの文字セットをutf8mb4に設定
SET NAMES 'utf8mb4';
Taskfile.yml
# https://taskfile.dev
version: '3'
env:
MIGRATION_ROOT: "tools/migrations"
SEED_ROOT: "tools/seeder"
tasks:
setup:
desc: "ローカル環境のセットアップを行う。(gitコマンドが使用できるようにする)"
cmds:
- cp {{.APP_ROOT}}/.gitconfig /root/.gitconfig
- git config --global core.autocrlf input
- git config --global --add safe.directory {{.APP_ROOT}}
# わざわざコピーする理由は、commit時に毎回メアドとユーザー名の設定(.gitconfigの作成)を求められ面倒なので、git cloneするなら作成済みであろう.gitconfigを使うという魂胆である。
# だが、Windowsユーザーが.gitconfigを使用中と解釈されるようでgit configコマンドが失敗するため、ファイルをコピーする必要がある。
# core.autocrlf inputを使用する理由は、Linuxの改行コードが原因で差分が表示されてしまうため。
# safe.directory $APP_ROOTを使用する理由は、WSL2側に配置しgitを使うには毎回求められるため。
環境構築手順
1.Dockerをインストール
2.VsCodeをインストール
3.ソースをクローン
4.VsCodeの拡張機能にDevContainersをインストール
5.Ctrl Shift Pでコマンドパレットを開く
6.DevContainer:Reopen in Containerを押下
7.Railsをインストール
gem update --system
gem install rails -v "~> 8.0.0"
8.Railsプロジェクトを作成
rails new . --force --database=mysql
9.Dockerfileを修正する
以下の記載があるコマンドを解除
.devcontainer/infra/ruby/Dockerfile
# 以下3つはrailsをインストールしたらコメントアウトを解除してください。
完成ソースコード