今回指定したバージョン
- Rails version 6.1.7.1
- Ruby version 2.7.7
- MySQLは最新version
- nodejsは互換性のある version16
条件
- docker-compose upでrails serverを起動できるようにすること
- ホストのファイルシステムとコンテナのファイルシステムを同期させること
Dockerfile
- まずは、apt-getでyarnを入れたもの
# Node.js & Yarn
FROM node:16-buster-slim
RUN yarn install
FROM ruby:2.7.7
RUN apt-get update
RUN apt-get install -y \
build-essential \
libpq-dev \
nodejs \
default-mysql-client \
yarn
default-mysql-client
WORKDIR /rails-docker-mysql
COPY Gemfile Gemfile.lock /rails-docker-mysql/
- そしてこちらがyarnをマルチステージビルドで別途入れたもの
# Node.js&yarn
FROM node:16 as node
FROM ruby:2.7.7
COPY --from=node /opt/yarn-* /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/
RUN ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
&& ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg
# Rails
RUN apt-get update
RUN apt-get install -y \
build-essential \
default-mysql-client
WORKDIR /rails-docker-mysql
COPY Gemfile Gemfile.lock /rails-docker-mysql/
RUN bundle install
- yarnをapt-getで入れるとapt-getのバージョンに引っ張られるといった指摘を受けましたのでシンボリックリンクを作成し修正しました。
※シンボリックリンクとは、オペレーティングシステム(OS)のファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組みのことです。 -
docker compose run --rm web bin/setup
を実行することでyarn installされるようにしました
docker-compose.yml
version: "3"
volumes:
data:
services:
web:
build: .
command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
ports:
- "3000:3000"
volumes:
- ".:/rails-docker-mysql"
environment:
- "DATABASE_PASSWORD=password"
tty: true
stdin_open: true
depends_on:
- db
db:
image: mysql
volumes:
- "data:/var/lib/mysql"
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
- docker-compose upでrailsプロセスとdbが起動し、http://localhost:3000 でアクセスできるようにしました
- 起動2回目で
A server is already running. Check /rails-docker-mysql/tmp/pids/server.pid.
とエラーになってしまう事があるのでcommandに
/bin/sh -c "rm -f tmp/pids/server.pid
と記述しwebサーバー起動時にpidファイルのキャッシュを削除されるようにしました
参考
udemyの教材はおすすめです!