Getting Started with Rails の環境を RemoteContainer で構築する

Getting Started with Rails の環境を、ローカルを一切汚さず RemoteContainer で一から構築する。

目次

開発環境

  • Windows10 WSL2 環境(Ubuntu 20.04 LTS)
  • Docker version 20.10.14, build a224086
  • Docker Compose version v2.2.3
  • Rails v7.0.3.1 時点での Getting Started with Rails 使用

注意)私の開発環境では Docker Desktop for Windows を使わず、WSL2 上の Ubuntu 20.04 に直接 docker, docker compose をインストールしている

ここに書かないこと

RemoteContainer の起動方法や必要な拡張機能など。

参考:VSCode RemoteContainerを導入する

手順の説明

  1. まず Ruby のコンテナに sqlite3 を入れた物を用意し、一旦コンテナを起動して rails new blog する
  2. コンテナを終了し、Dockerfile を書き換えて、rails のサーバーが起動した状態のコンテナを作り直す

手順1. rails new blog する

まず下記のようなディレクトリ構成にする。

作業ディレクトリ
|
|-.devcontainer
| |-.env
| |-compose.yml
| |-devcontainer.json
| |-Dockerfile
|
|-src(空ディレクトリ)

それぞれの中身を下記のようにする。

.env

UID=1000
GID=1000

ここに記述する UID, GID は WSL2 上の作業ユーザーの値を指定する。
参考:@IT > Linux & OSS > Linux Tips Index > ユーザーのユーザーIDやグループIDを調べるには

compose.yml

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - UID=${UID}
        - GID=${GID}
    volumes:
      - ../src:/app
    tty: true

devcontainer.json

{
    "name": "dev",
    "dockerComposeFile": ["compose.yml"],
    "remoteUser": "docker",
    "service": "app",
    "workspaceFolder": "/app"
}

Dockerfile

FROM ruby:3.1
ARG UID
ARG GID

RUN apt-get update && apt-get install -y sqlite3

RUN groupadd -g $GID docker
RUN useradd -u $UID -g docker -m docker
USER docker

WORKDIR /app

ここまでで一旦 devcontainer を起動する。

起動したら

$ gem install rails

で rails をインストールし、

$ rails new blog

でアプリケーションを作成する。

ここまでやったらコンテナを閉じてホストに戻る。

devcontainer 起動時にエラーが出たとき

再現性がなくて原因がわからないのだがエラーが出ることがある。

エラーが出た場合、一旦作った container と image を消さないとずっとエラーが出続けるので、再度起動してみる前に消す。

まず container から消す。

$ docker container ls -a
CONTAINER ID   IMAGE                                           COMMAND                  CREATED          STATUS                      PORTS     NAMES
1fb7cd26a97b   vsc-ror2-cb5c32dfe7b9b5d3d4aa19955296c975-uid   "/bin/sh -c 'echo Co…"   52 seconds ago   Exited (0) 51 seconds ago             ror2_devcontainer-app-1

$ docker container rm 1fb7cd26a97b
1fb7cd26a97b

次に image を消す。

$ docker image ls
REPOSITORY                                      TAG          IMAGE ID       CREATED         SIZE
vsc-ror2-cb5c32dfe7b9b5d3d4aa19955296c975-uid   latest       950136f6f936   3 minutes ago   917MB
ror2_devcontainer_app                           latest       cd12d5a1c5df   3 minutes ago   917MB

$ docker image rm vsc-ror2-cb5c32dfe7b9b5d3d4aa19955296c975-uid
Untagged: vsc-ror2-cb5c32dfe7b9b5d3d4aa19955296c975-uid:latest
Deleted: sha256:950136f6f936a2930038b73bc930fd42bc70ccc945548754465092fb538bf3a8
Deleted: sha256:c471317860621c0d712e341fe1bdf105e995f18a544b56325d1c2813d5ad4869
Deleted: sha256:20eb24c241b3e9b642196beb92cb50c4eccc48aba786ea062e559907158fa754
Deleted: sha256:d055a2731e240da5ae15922ca6eea2bdf13718eb29f6337f72ce6450fc2d4494
Deleted: sha256:9e6c28e1e922bb34bd10f50a03bf1a76b828343e74bd574e5ab728d02a4db616
Deleted: sha256:1e181f121c536b810a924311d7e199d27b4af11c25b4ed226b321414c643ec40
Deleted: sha256:8e52a78197a28418ae4f09d2fb9f4a0209a3be63fdb873060f1f5a8bb084f982
Deleted: sha256:7243cefbefe4c7d3d23687be0f3ed828b5f172ea40daddb57dc061a64049ccee

$ docker image rm ror2_devcontainer_app
Untagged: ror2_devcontainer_app:latest
Deleted: sha256:cd12d5a1c5dffd1772045d0f4ebd2fb0f235b0b27eab96267b430ed19f1c7cf9
Deleted: sha256:fba333a4fbab69a36a6d702cfebaac054ec96ae58ae47c57209a4bb7bccd74bf
Deleted: sha256:3e95fffe154dc37a8477781344cc197cb81df16f751cadbfc8938751cbf6e9f7
Deleted: sha256:145aeb76ec67b4d64eecbfe4d79ff396ef0f661461d5d43ec28023514352f962
Deleted: sha256:05631fb032090c8a5255d01a2ef609f3aadf6d01113bb2f9fed144b7395059c1
Deleted: sha256:9f870d4649042c207aefb46ef6acd080e9549ae3f807112d43e6c8573a9c93ab
Deleted: sha256:35106b04e73930afca8e80459c1f2314699af9a1945f3b0d9c03ba8252f7c59e
Deleted: sha256:d83bfe0251a811101d2358c57de348b52dbd2e684c30cca98b00b09188a18dc1
Deleted: sha256:8d81118b7860aadfff083601f384e5199e6acbbb04048874840828c7de74b1e3
Deleted: sha256:69ff0c98179bbcc8bc30c5db7e799024cf46ff9d5b61bddfa05359e6abea70ae
Deleted: sha256:9d545a0969732d7a1151016f1316506b98395d296dc85319211f6f89da1c4264

手順2. rails のサーバーが起動した状態のコンテナを作り直す

現時点でのディレクトリ構成は下記のようになっているはずである。

作業ディレクトリ
|
|-.devcontainer
| |-.env
| |-compose.yml
| |-devcontainer.json
| |-Dockerfile
|
|-src
| |-blog(rails アプリケーションが入っている)

src/blog/Gemfile と src/blog/Gemfile.lock を .devcontainer 直下にコピーする。

そして .devcontainer/Dockerfile を以下のように書き換える。(Gemfile, Gemfile.lock をコピーし bundle install する手順を追加、EXPOSE 追加)

FROM ruby:3.1
ARG UID
ARG GID

RUN apt-get update && apt-get install -y sqlite3

RUN groupadd -g $GID docker
RUN useradd -u $UID -g docker -m docker
USER docker

WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install

EXPOSE 3000

また .devcontainer/compose.yml を以下のように書き換える。(command 追加、volumes 書き換え、ports 追加、tty 削除)

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - UID=${UID}
        - GID=${GID}
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ../src/blog:/app
    ports:
      - "3000:3000"

上記書き換え後、devcontainer 起動時にエラーが出たときの手順で一旦 container と image を削除する。
(削除しなくても起動→Rebuild でいけると思われるのだが、私の環境だとなぜか起動時エラーとなるため)

container と image を削除後、container を起動する。

起動できたら http://localhost:3000/ を開き、初期画面が出たら成功。


最終的な状態

最終的なディレクトリ構成

作業ディレクトリ
|
|-.devcontainer
| |-.env
| |-compose.yml
| |-devcontainer.json
| |-Dockerfile
| |-Gemfile
| |-Gemfile.lock
|
|-src
| |-blog(rails アプリケーションが入っている)

.env

UID=1000
GID=1000

compose.yml

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - UID=${UID}
        - GID=${GID}
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - ../src/blog:/app
    ports:
      - "3000:3000"

devcontainer.json

{
    "name": "dev",
    "dockerComposeFile": ["compose.yml"],
    "remoteUser": "docker",
    "service": "app",
    "workspaceFolder": "/app"
}

Dockerfile

FROM ruby:3.1
ARG UID
ARG GID

RUN apt-get update && apt-get install -y sqlite3

RUN groupadd -g $GID docker
RUN useradd -u $UID -g docker -m docker
USER docker

WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install

EXPOSE 3000

以上