背景
- 普段はローカル環境で Rails プロジェクトを開発していた
- しかし「ローカル環境がどんどん汚れてしまうのでは?」という不安があった
- Docker を使えば環境を隔離できるし、Docker の練習にもなると思い立った
- そこで 既存の Rails プロジェクトを VSCode Dev Container 上で開発する ことにした
今回満たしたい要件
- Ruby 3.3.9
- Ruby on Rails
- GitHub との SSH 接続(ホストに登録済みの SSH 鍵をそのまま利用)
- SQLite3 環境
- VSCode での開発
手順
- プロジェクトディレクトリに移動
- 既存の Rails プロジェクトのディレクトリに移動
- cd my-rails-project
- .devcontainer/ を作成
Rails プロジェクトにはすでに 本番環境用の Dockerfile が生成されているため、開発用には別の設定を用意する。プロジェクト直下に .devcontainer/ ディレクトリを作成し、その中に Dockerfile.dev と devcontainer.json を作成。
Dockerfile.dev
# .devcontainer/Dockerfile.dev
FROM ruby:3.3.9
# 開発に必要なパッケージ
# - openssh-client: GitHub に SSH 接続するため
# - nodejs: Rails が必要とする
# - sqlite3, libsqlite3-dev: Rails で SQLite を使うため
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y \
build-essential \
openssh-client \
git \
nodejs \
sqlite3 \
libsqlite3-dev \
&& rm -rf /var/lib/apt/lists/*
# 開発用ユーザを作成
# これにより VSCode で開いたときに `vscode` ユーザでログインでき、安全
RUN useradd -m -s /bin/bash vscode
USER vscode
WORKDIR /rails
devcontainer.json
// .devcontainer/devcontainer.json
{
"name": "Rails Dev Project",
"dockerFile": "Dockerfile.dev",
"mounts": [
"source=${localWorkspaceFolder},target=/rails,type=bind"
],
"runArgs": [
"-v", "${env:SSH_AUTH_SOCK}:/ssh-agent",
"-e", "SSH_AUTH_SOCK=/ssh-agent"
],
"remoteUser": "vscode"
}
ポイント
mounts:
ホストのディレクトリを /rails にマウント。
→ ファイルをホストに残したまま編集でき、コンテナ削除してもコードは消えない
runArgs:
ホストの ssh-agent をコンテナに転送。
→ コンテナから GitHub に SSH 接続する際、ホストの鍵をそのまま利用できる
VSCode で開く
VSCode でプロジェクトを開く。Dev Containers 拡張機能がインストール済みなら「コンテナ環境で開きますか?」と聞かれる。「はい」を選択すると自動でビルドが始まり、コンテナにアタッチされる。
GitHub SSH 接続確認
コンテナのターミナルから以下を実行:
ssh -T git@github.com
成功すると次のようなメッセージが出る:
Hi User-Name! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
これで GitHub リポジトリの clone / push が可能になる。