1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DockerでRails/MySQLの環境構築

Last updated at Posted at 2023-06-18

はじめに

DockerでRailsとMySQLの環境を構築するにあたって、調べてもよくわからない設定があったりして混乱したので、とりあえずRailsアプリケーションが動かせる最低限の環境を作り、この状態から必要な要素を随時追加していくというやり方を取りました。

ディレクトリ構成

.
├── .devcontainer
│   └── devcontainer.json
├── .gitignore
├── app
│   ├── Gemfile
│   └── Gemfile.lock
├── compose.yml
└── docker
    ├── api
    │   └── Dockerfile
    └── db

今回は構成要素が少ないので、docker/以下のDockerfileはプロジェクトルートに配置するプレーンな構成の方がわかりやすかったかもしれません。
以下で紹介する以外のファイルは無くても問題ありませんが、ディレクトリ構成を変更する場合はDockerfile及びcompose.ymlの編集が必要になる場合があります。

各ファイルの準備

コンテナ内でRailsプロジェクトを生成するため、Gemfileに下記の内容を記述しておきます。

app/Gemfile
source "https://rubygems.org"
gem "rails", "~> 7.0.5"
docker/api/Dockerfile
FROM ruby:3.2.2

WORKDIR /app

COPY app/Gemfile* ./

RUN bundle install

CMD ["rails", "server", "-b", "0.0.0.0"]
compose.yml
version: "3.9"

services:
  api:
    build:
      context: .
      dockerfile: ./docker/api/Dockerfile
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    volumes:
      - ./app:/app

  db:
    image: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: password

環境構築

最初にイメージをビルドします。

$ docker compose build

下記のコマンドでコンテナ内にRailsプロジェクトを生成します。
DockerfileWORKDIR /appを指定し、下記のコマンドで.を使ってカレントディレクトリ指定することで、コンテナ内の/appにプロジェクトが展開されて生成されます。
compose.ymlに設定を記述しているので、ホスト側にもプロジェクトの内容が同期されます。

docker compose run --rm api rails new . --database=mysql --api

上記のコマンドによって/app内に新たなGemfileが生成されますが、既にGemfileが存在しているため下記の表示が出て一時ストップされます。
既存の内容は置き換えてしまって問題ないので、Yを入力するかEnterでそのまま進めます。これで新しいRailsプロジェクトに適したデフォルトの Gemfile が生成されます。

conflict  Gemfile
Overwrite /app/Gemfile? (enter "h" for help) [Ynaqdhm] 

この後設定ファイルを編集する必要があるのですが、Dockerコンテナ内で作成されたファイルはrootとして作成されるため、ホスト側から編集しようとするとパーミッションエラーが発生します。
その前に下記のコマンドでカレントディレクトリ以下の全てのファイルとフォルダのオーナーを現在のユーザーに変更します。

sudo chown -R $USER:$USER .

データベースへの接続にcompose.ymlで指定したパスワードとサービス名を使用するため、ホスト側からapp/config/database.ymlを下記のように編集します。内容は適宜置き換えてください。

config/database.yml
default: &default
  # 省略
  password: password
  host: db

再度ビルドしてコンテナを起動します。

docker compose build
docker compose up -d

この状態で http://localhost:3000/ にアクセスすると、ActiveRecord::NoDatabaseErrorというエラーメッセージが表示されます。
データベースが作成されていないことが原因なので、下記のコマンドでデータベースを作成します。

docker compose run --rm api rails db:create

再度 http://localhost:3000/ にアクセスすると無事に起動できているはずです。
スクリーンショット 2023-06-18 224704.png

あとがき

Dockerは便利ですがまだ不慣れで、必要な設定の選定がいつも大変です。アドバイス等がありましたら、ぜひご教授いただきたく存じます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?