LoginSignup
0
0

More than 1 year has passed since last update.

ローカルでDocker-rails環境を立ち上げる

Last updated at Posted at 2022-04-28

背景

ふと時代に取り残されているような、周囲に置いていかれるような不安に駆られてしまいまして、コンテナをローカル環境で使い始めました。
デプロイする際の手間が減ること、コンテナを簡単に削除できることからRubyアプリケーションを作成する時は今後も使い続けていこうと思いました。
導入の際に実際に行ったことを手順に落として残しておこうと思います。

手順

①Dockerfile, docker-compose.yml, Gemfile, Gemfile.lockを作成します。

なぜDockerfileとdocker-compose.ymlを分けるのか?

  • コンテナを分けるため管理がしやすい

  • 実行コマンドが簡潔

といった理由で今回は分けて記述します。

Dockerfile

FROM 
ruby:2.5
RUN apt-get update -qq && \             #←ここの\が抜けているとエラーになる
  apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /myapp
WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install
COPY . /myapp
docker-compose.yml
version: '3'

services:
  db:
    image: mysql:5.7.30
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: ********
    ports:
      - "3306:3306"
    volumes:
      - ./db/mysql/volumes:/var/lib/mysql

  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
      - gem_data:/usr/local/bundle
    ports:
      - 3000:3000
    depends_on:
      - db
    tty: true
    stdin_open: true

volumes:
  gem_data:

Gemfile

source 'https://rubygems.org'
gem 'rails', '5.2.2'

Gemfile.lockには何も記載しません。

②rails newの際に実行したコマンド

docker-compose run web rails new . --force --database=mysql --skip-bundle

runの後に実行するserviceを指定します。
docker-compose.ymlで指定したserviceであるwebを実行していきます。

③docker-compose build

新しくローカルのファイルを更新した際は一度buildを実行する必要があります。
Gemfileにmysqlを追加した場合等、都度行います。

④docker-compose up (-d)

buildしたコンテナにdocker-compose up を実行します。
-d をつけるとバックグラウンドで実行してくれます。

⑤起こしたエラー

traceback (most recent call last): file "docker-compose", line 3, in <module> file "compose/cli/main.py", line 92, in main typeerror: can only concatenate str (not "dict") to str

docker-compise.ymlに記載したコマンドに\が入っていないことが原因でした。

error response from daemon: oci runtime create failed: container_linux.go:380: starting container process caused: exec: "db:create": executable file not found in $path: unknown

ActiveRecordでNoDatabaseErrorが出ている際に、
image.png

docker-compose run web bundle exec rake db:create

docker-compose build

docker-compose up -d
としなかったことが原因。

created databaseの文言が表示されると解消されます。

⑥config/database.ymlの書き換え

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: *********                       #passwordとhostは変更が必要
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>

⑦再度docker-compose build, docker-compose up

ローカルのファイルに変更を加えたため、再度実行します。

⑧your on railsの画面

スクリーンショット 2022-04-28 20.49.24.png

無事環境構築できました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0