#はじめに
Dockerについて学習し、既存のRailsアプリにDockerを導入しようと思い、公式のクイックスタートなどを参照しながら行いました。
その時に発生したエラーを備忘録のため、投稿しています。
#環境
Ruby '2.6.5'
Rails '6.0.0'
Docker for Mac導入済み
#エラー事例①
###状況
FROM ruby:2.6.5
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn
RUN mkdir /(アプリ名)
WORKDIR /(アプリ名)
COPY Gemfile /(アプリ名)/Gemfile
COPY Gemfile.lock /(アプリ名)/Gemfile.lock
RUN bundle install
COPY . /(アプリ名)
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
% docker-compose build で立ち上げようとすると下記のエラーが発生
###エラー文
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.1.4) required by your /assist/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.4`
from /usr/local/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
from /usr/local/bin/bundle:23:in `<main>'
ERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 1
###解決策
RUN gem install bundlerを挿入すると解決!
(中略)
COPY Gemfile.lock /(アプリ名)/Gemfile.lock
RUN gem install bundler
RUN bundle install
(中略)
調べてみると、原因はlocal環境とDocker内でのbundlerのバージョンが違うため、エラーが出たそうです。gem install bundlerを入れるととりあえず解決。。。まだまだあります。。。
#エラー事例②
###状況
version: "3"
services:
db:
image: mysql:5.6.47
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: root
ports:
- "3000:3000"
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'"
stdin_open: true
tty: true
volumes:
- .:/(アプリ名)
- gem_data:/usr/local/bundle
ports:
- "3000:3000"
depends_on:
- db
volumes:
mysql_data:
gem_data:
docker-compose build成功後、docker-compose up -dコマンドを実行したところ、
###エラー文
ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint myapp_web_1 (ae889e882d7c9f8b72f9c9b244159d86662f4abebef7d15fac4016573fe56de4): Bind for 0.0.0.0:3000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
###解決策
DBサーバーとWebサーバーのポート番号を3000で同じにしていたため、Webサーバーが立ち上がらないことが原因であると考えます。単純なミスでした。。
DBのポート番号を3306に変更し、修正しました。
(中略)
ports:
- "3306:3306"
#エラー事例③
###状況
先ほどのエラーを解決後、もう一度、docker-compose upコマンド実行してみると、、下記のエラーが発生。
warning Integrity check: System parameters don't match
error Integrity check failed
error Found 1 errors.
web_1 |
web_1 |
web_1 | ========================================
web_1 | Your Yarn packages are out of date!
web_1 | Please run `yarn install --check-files` to update.
web_1 | ========================================
web_1 |
web_1 |
web_1 | To disable this check, please change `check_yarn_integrity`
web_1 | to `false` in your webpacker config file (config/webpacker.yml).
web_1 |
web_1 |
web_1 | yarn check v1.22.5
web_1 | info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command.
web_1 |
web_1 |
web_1 | Exiting
見たところ、yarnのupgradeを行ってくださいかのように感じたため、yarn upgradeコマンドを実行するも、変わらず。。。
###解決策
エラー文をよくよく見てみると、、、
web_1 | To disable this check, please change `check_yarn_integrity`
web_1 | to `false` in your webpacker config file (config/webpacker.yml).
のような記述があったため、早速該当のディレクトリに行ってみると
(中略)
check_yarn_integrity: false
ありました!!defaultでtrueになっていたため、falseに書き換えると解決しました!!!最後の1個いきます。。。
#エラー事例④
###状況
docker-compose up -dが成功し、localhost:3000でアクセスしようとすると
ActiveRecord::NoDatabaseError
が発生。
###解決策
単純でしたね。db:createコマンドを忘れていました。。。
% docker-compose exec web rails db:create
% docker-compose exec web rails db:migrate
#終わりに
ビューファイルが思いっきり崩れていたので、原因究明してきます。。。。