calender-app.setting
bash
$ touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock,entrypoint.sh}
Dockerfile
# Rubyのバージョンを指定した公式イメージをベースに使用
FROM ruby:3.2.2
# 必要なパッケージのインストール
RUN apt-get update -qq \
&& apt-get install -y nodejs postgresql-client npm vim \
&& rm -rf /var/lib/apt/lists/* \
&& npm install --global yarn
# コンテナの作業ディレクトリを指定
RUN mkdir /myapp
WORKDIR /myapp
# ホストのGemfileとGemfile.lockをコンテナにコピー
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
# bundle installを実行
RUN bundle install
# カレントディレクトリのファイルをコンテナにコピー
ADD . /myapp
# コンテナ起動時に実行されるスクリプトをコピーして実行可能にする
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
# コンテナが外部に公開するポート番号を指定
EXPOSE 3000
# コンテナ起動時に実行されるメインプロセスを指定
CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres_volume:/var/lib/postgresql/data
restart: always
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bin/dev"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- .:/myapp
ports:
- "3000:3000"
restart: always
tty: true
stdin_open: true
depends_on:
- db
volumes:
postgres_volume:
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 "$@"
Gemfile
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem "rails", "~> 7.0.8"
bash
$ docker compose run web rails new . --force --database=postgresql --javascript=esbuild --css=tailwind
$ docker compose down --remove-orphans
$ docker compose up --build
$ docker compose run web rails db:create
$ docker compose run web rails db:migrate
database.yml
default: &default
adapter: postgresql
encoding: unicode
# ここから
host: db
username: postgres
password: password
# ここまで
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
Procfile.dev
web: env RUBY_DEBUG_OPEN=true bin/rails server -b '0.0.0.0' -p 3000
js: yarn build --watch
css: yarn build:css --watch
bash
docker compose up -d
補足
なぜかTailwindを書くと反映されない時があるので
$ docker compose exec web rails assets:precompile
をしてからコンテナを再起動すると反映される様になる。
なぜか rails newをした後に、
docker compose run web rails db:createをすると下の様なエラーが出るので
rails-2.0.10, stimulus-rails-1.3.4, cssbundling-rails-1.4.1, jbuilder-2.13.0, bootsnap-1.18.4, debug-1.9.2, web-console-4.2.1, capybara-3.40.0, selenium-webdriver-4.25.0, sprockets-4.2.1, msgpack-1.7.3, irb-1.14.1, reline-0.5.10, bindex-0.8.1, addressable-2.8.7, regexp_parser-2.9.2, xpath-3.2.0, base64-0.2.0, logger-1.6.1, rexml-3.3.8, rubyzip-2.3.2, websocket-1.2.11, rdoc-6.7.0, io-console-0.7.2, public_suffix-6.0.1, psych-5.1.2, stringio-3.1.1 in locally installed gems
Run `bundle install --gemfile /myapp/Gemfile` to install missing gems.
これは、 docker compose run web bundle installをしても出来なかったので、
Dockerの環境を整理するために孤立したコンテナ(orphans)を削除してから再び環境を起動して再びデーターベースを作成したらできる様になりました。
- 私なりに考えた結果
Railsプロジェクトの依存関係が解決できていない状態だったのでbuildを先にすればよかったのかなと思いました