🌟
docker-compose + rails6 環境構築
準備
rbenvを使っている場合は、下記を要確認
- なるべく安定版の最新版を使う方針。ruby 2.7.4。rails 6.1.4。
- rbenvのrubyのパスが通っているか?
ruby -v
,rbenv local 2.7.4
など - Dockerfileのrubyバージョンと同じもののrubyのパスが通っているか
- rbenvのrubyにbundlerが入っているか
gem list
gem install bundler
- bundlerのパスがrbenvのrubyであるか。
which bundler
- fish shellとrbenvを使っている場合にrbenvのパスを通すのはfish-rbenvが楽だった https://github.com/rbenv/fish-rbenv
参考資料
- https://docs.docker.com/samples/rails/ docker公式,docker-composeのやり方。現在rails5向けなので下記サイトを参考に調整する
- https://zenn.dev/tmasuyama1114/articles/rails-docker-6x-how-to 上記の準備で触れたがbundlerをインストールした状態でこちらを参考に進めた。
公式サイトに沿ってファイル作成
- Dockerfile
- Gemfile
- Gemfile.lock
- entrypoint.sh
- docker-compose.yml
Dockerfile
FROM ruby:2.7.4
## nodejsとyarnはwebpackをインストールする際に必要
# yarnパッケージ管理ツールをインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && apt-get install -y nodejs build-essential libpq-dev postgresql-client yarn
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
RUN yarn install --check-files
RUN bundle exec rails webpacker:install
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]
Gemfile
source 'https://rubygems.org'
gem 'rails', '6.1.4'
※ビルド後に勝手に書き換わる。
Gemfile.lock
$ touch Gemfile.lock
で生成。中身は空。
entrypoint.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
docker-compose.yml
version: "3.9"
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
ビルドしていく
※途中でビルドがコケたら docker-compose down
でコンテナ停止して、docker desktopで途中で死んでるimagesを削除したりした。ローカルのファイルも生成されているので、削除して初期の5ファイルに戻したりしながら進めた。
docker-compose run --no-deps web rails new . --force --database=postgresql
docker-compose build
- config/database.yml書き換え
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: password
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
docker-compose up
- 別ターミナルで
docker-compose run web rake db:create
完了
- http://localhost:3000/ にアクセスしてみる
悩んだところ
- 冒頭にも書いたが、fish shellでrbenvを使っていてrubyとbundleコマンドのパスが、rbenv配下ではなく、元々入っていたrubyのパスで動いていたので
yarn install
やbundle install
が失敗してウンウン悩んだ。 - 参考サイトのDockerfileのyarnとwebpackerをインストールコマンドを1行1行これは必要なのだろうかと調べた。
Discussion