久しぶりにRailsで何か作ろうと思い、とりあえずDockerでローカル環境構築したのでメモ。
構築した環境は
- ruby:alpine3.13
- MySQL
- Rails6
ベースイメージに alpine
、DBをMySQLにしている点以外は、DockerのQuickStartと同じです。
Dockerについて学びたい人は「【超厳選】UdemyでDockerを学べるおすすめ講座2選」がオススメ!!
1. Dockerfile作成
FROM ruby:alpine3.13 RUN apk update \ && apk add --no-cache gcc make libc-dev g++ mariadb-dev tzdata nodejs~=14 yarn WORKDIR /myapp COPY Gemfile . COPY Gemfile.lock . RUN bundle install --jobs=2 COPY . /myapp COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
2. docker-compose.yml作成
version: "3.9" services: web: build: . container_name: myapp_web command: ash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp ports: - "3000:3000" env_file: - .env depends_on: - db db: image: mysql:8.0.24 container_name: myapp_db environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} ports: - "3306:3306" volumes: - db:/var/lib/mysql volumes: db:
3. .envファイル作成
docker-compose.yml
と同じ階層に .env
ファイルを作成して環境変数を定義。
DB_PASSWORD="test"
4. entrypoint.sh作成
#!/bin/sh
set -e
rm -f /myrecipe/tmp/pids/server.pid
exec "$@"
5. Railsプロジェクト作成(rails new)
まず Gemfile
と Gemfile.lock
ファイルを作成。Gemfileの中身は
source 'https://rubygems.org' gem 'rails', '6.1.3.1'
コンテナ内で rails new
してRailsプロジェクトを作成
$ docker-compose run --no-deps web bundle exec rails new . --force --database=mysql
6. database.yml修正
host
と password
を修正。
--- a/config/database.yml +++ b/config/database.yml @@ -14,8 +14,8 @@ default: &default encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root - password: - host: localhost + password: <%= ENV["DB_PASSWORD"] %> + host: db
7. ビルド、コンテナ起動
$ docker-compose build $ docker-compose up
8. db:create, db:migrate
$ docker-compose run web rake db:create $ docker-compose run web rake db:migrate
localhost:3000
にアクセスして確認!
【メモ】デバッグの流れ
alpine
は軽量ですが色々と足りないパッケージが多いので必要なものをインストールする必要があります。
alpine
利用時に、どのパッケージを追加すれば良いか把握できていなかったので、エラーを起こしながら調べていきました。
とりあえずDockerfileとdocker-compose.yml作成
とりあえずコンテナ起動できるレベルのファイルを作成しました。
Dockerfile
FROM ruby:alpine3.13 WORKDIR /myapp COPY Gemfile . COPY Gemfile.lock .
docker-compose.yml
version: "3.9" services: web: build: . command: ash -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 db: image: mysql:8.0.24 environment: MYSQL_ROOT_PASSWORD: password ports: - "3306:3306"
コンテナ内に入り、rails s できるまで試行錯誤
Dockerfile, docker-compose.ymlが出来たら、とりあえずコンテナ内に入ります。
$ docker-compose exec web /bin/ash
あとはbundle install
, rails new
を実行して、エラーを起こしながら必要なパッケージを追加していく。
Dockerについて学びたい人は「【超厳選】UdemyでDockerを学べるおすすめ講座2選」がオススメ!!