背景
ふと時代に取り残されているような、周囲に置いていかれるような不安に駆られてしまいまして、コンテナをローカル環境で使い始めました。
デプロイする際の手間が減ること、コンテナを簡単に削除できることから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
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が出ている際に、
docker-compose run web bundle exec rake db:create
↓
docker-compose build
↓
docker-compose up -d
としなかったことが原因。
created databaseの文言が表示されると解消されます。
⑥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の画面
無事環境構築できました!