Dockerの勉強をしたので、その復習として既存のRailsアプリをDocker化することにしました。
環境
Ruby: 3.2.2 Rails: 7.0.6 DB: PostgreSQL
手順
Dockerfileの作成
まずはイメージを作成するために必要なDockerfileを作成します。
今回Rubyのイメージを3.2.2と指定したところ、RUN apt-get ~
の実行の際に 次のようなエラーが生じました。
生じたエラー
#5 0.903 Get:1 http://deb.debian.org/debian bookworm InRelease [151 kB] #5 0.959 Get:2 http://deb.debian.org/debian bookworm-updates InRelease [52.1 kB] #5 0.991 Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] #5 1.032 Err:1 http://deb.debian.org/debian bookworm InRelease #5 1.032 The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY F8D2585B8783D481 #5 1.084 Err:2 http://deb.debian.org/debian bookworm-updates InRelease #5 1.084 The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 #5 1.133 Err:3 http://deb.debian.org/debian-security bookworm-security InRelease #5 1.133 The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 54404762BBB6E853 NO_PUBKEY BDE6D2B9216EC7A8 #5 1.135 Reading package lists... #5 1.149 W: GPG error: http://deb.debian.org/debian bookworm InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY F8D2585B8783D481 #5 1.149 E: The repository 'http://deb.debian.org/debian bookworm InRelease' is not signed. #5 1.149 W: GPG error: http://deb.debian.org/debian bookworm-updates InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 #5 1.149 E: The repository 'http://deb.debian.org/debian bookworm-updates InRelease' is not signed. #5 1.149 W: GPG error: http://deb.debian.org/debian-security bookworm-security InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 54404762BBB6E853 NO_PUBKEY BDE6D2B9216EC7A8 #5 1.149 E: The repository 'http://deb.debian.org/debian-security bookworm-security InRelease' is not signed. #5 1.149 E: Problem executing scripts APT::Update::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true' #5 1.149 E: Sub-process returned an error code ------ executor failed running [/bin/sh -c apt-get update && apt-get install -y build-essential libpq-dev nodejs postgresql-client yarn]: exit code: 100
これに対する解決策としてRubyのイメージをbullseyeに変更しました。(Ruby参考記事)
Dockerfile
# apt-getのエラーを防ぐためにbullseyeイメージを使用 FROM ruby:3.2.2-bullseye # 必要なパッケージをインストール RUN apt-get update && apt-get install -y \ build-essential\ libpq-dev\ nodejs\ postgresql-client\ yarn # コンテナ内にホストと同じディレクトリを作成。 WORKDIR /rails-docker COPY Gemfile Gemfile.lock /rails-docker/ RUN bundle install
docker-compose.ymlの作成
今回はRailsコンテナとDBコンテナを作成するため、docker composeを使用します。docker composeを使用することで、コンテナ起動時に長いコマンドを打ち込む必要がなくなり、複数コンテナを扱いやすくなります。
また、PostgreSQLイメージを12とするとDBコンテナが起動しないという事象が発生したため、DBイメージにはpostgres:12-bullseye
を使用しました。
PostgreSQL参考記事
docker-compose.yml
version: '3' # ホストにボリューム領域を確保する volumes: db-data: services: web: build: . # コンテナ起動時にコマンドをこの実行 command: bundle exec rails s -p 3000 -b '0.0.0.0' # 使用するポート(Railsのデフォルトは3000) ports: - '3000:3000' volumes: - '.:/rails-docker' # database.ymlの環境変数を設定 environment: - 'DATABASE_PASSWORD=postgres' tty: true stdin_open: true # dbコンテナ作成後にwebコンテナを作成する depends_on: - db links: - db db: image: postgres:12-bullseye # コンテナを削除してもデータが消えないように、ホストのファイルをコンテナにマウントする volumes: - 'db-data:/var/lib/postgresql/data' # 使用するデータベースの環境変数を設定 environment: - 'POSTGRES_USER=postgres' - 'POSTGRES_PASSWORD=postgres'
database.yml
最後にDBの設定をファイルに記述していきます。
default: &default adapter: postgresql encoding: unicode # docker-compose.ymlのサービス名を指定する host: db user: postgres # PostgreSQLのデフォルトポートを指定 port: 5432 # docker-compose.ymlで指定した内容を読み取る password: <%= ENV.fetch("DATABASE_PASSWORD") %> pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
ビルド後、DBを作成
# コンテナを起動。再ビルド時には「--build」をつける docker-compose up -d # コンテナ内に入る docker-compose exec web bash #コンテナ内でDB作成 rails db:create # データベースのテーブル定義を作成 rails db:migrate # コンテナを抜ける exit # コンテナを再起動。「restart」でも可 docker-compose up
エラー無く実行ができれば完了
確認
localhost:3000
にアクセスし、アプリのデータ登録を行う。その後、Ctr+Cでアプリを終了し、docker-compose up
でコンテナを再起動させ、先程登録したデータが残っているかを確認する。
参考資料
クィックスタート: Compose と Rails
米国AI開発者がゼロから教えるDocker講座
php:8.2-fpmのdocker imageでapt-getしたらエラーが出まくった
PostgreSQL参考記事