既に作っていたrailsアプリにdockerを導入してみました。
なかなか難しくてかなり時間かかってしまいました。以下に記録として残しておきます。
早速やってみよう
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
:コンテナに対してコマンドを実行
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に統一しました。
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コンテナではなくソケットファイルに接続されてしまうようです。
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)