2
0

More than 1 year has passed since last update.

docker-composeを既存のアプリへ導入【Rails×PostgreSQL】

Posted at

既に作っていたrailsアプリにdockerを導入してみました。
なかなか難しくてかなり時間かかってしまいました。以下に記録として残しておきます。

早速やってみよう

Dockerfile
FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

WORKDIR /port
COPY Gemfile /port/Gemfile
COPY Gemfile.lock /port/Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /port

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

基本的に公式のクイックスタートを使用しました。結構シンプルです。
ただクイックスタートそのままだと「bundlerが無いよ」とエラーが出るのでRUN gem install bundlerを加えています。

FROM:ベースになるイメージ(Gemfileのrubyのバージョンと揃える必要あり)
WORKDIR:作業ディレクトリの設定
COPY:後に続くファイルやディレクトリをコンテナへコピーする
RUN:コンテナに対してコマンドを実行


docker-compose.yml
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_DATABASE: app_user_role
    ports:
      - '5432:5432'

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/port
    ports:
      - "3000:3000"
    depends_on:
      - db
  • image: postgres → docker hubからpostgresというイメージをひっぱって来てビルドします

  • build: . → ルートディレクトリにあるDockerfileを使ってイメージをビルドするのを意味します。

  • depends_on: - db → コンテナの依存関係を示します。こうすることでdbが起動した後にwebが起動するようになります


デフォルトでSQLite3を使用していましたが、本番環境がPostgreSQLなので開発環境やテスト環境もpostgreSQLに統一しました。

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
  host: db
  username: app_user_role
  password: password

development:
  <<: *default
  database: port_development

test:
  <<: *default
  database: port_test

production:
  <<: *default
  database: port_production

host: dbは必須です。これ無しでdocker-compose upするとdockerコンテナではなくソケットファイルに接続されてしまうようです。


entrypoint.sh
set -e

rm -f /port/tmp/pids/server.pid

exec "$@"

参考

皆さんの知恵を拝借させていただいたことでdockerの導入が完了し、dockerの理解も深まったと思います。ありがとうございました。

【Docker】Rails + PostgreSQLの開発環境構築時に「psql: could not connect to server: No such file or directory」
Dockerの環境構築でcould not connect to server: Connection refusedのエラーが出た時の対処法
Dockerで既存アプリの開発環境を作成【Ruby2.6 + Rails5.2 + Mysql5.7】
既存のRailsアプリにDockerを導入する手順
RailsのデータベースをSQLiteからPostgresqlに切り替える方法
docker docs (Quickstart: Compose and Rails)

2
0
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
2
0