概要
Dockerでの開発環境構築に慣れていない私は、練習がてら公式の手順を元にRailsの開発環境を構築してみることに。
https://docs.docker.com/compose/rails/
その時ハマった事象と解決方法のメモ。
落とし穴
最近 Rails6がリリース されたということで、せっかくだから使ってみるかな!
→それが悲劇の始まりとは知る由もなく...
Your Ruby version is 2.6.3, but your Gemfile specified 2.6.0 問題
事象
Build the Project の手順でdocker-compose build
した時に出たエラーメッセージ。
$ docker-compose build
db uses an image, skipping
Building web
Step 1/15 : FROM ruby:2.6
---> 8fe6e1f7b421
Step 2/15 : RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
---> Using cache
---> b487730f3d14
:
(中略)
:
Step 9/15 : RUN bundle install
---> Running in 3e945eba544e
Your Ruby version is 2.6.3, but your Gemfile specified 2.6.0
ERROR: Service 'web' failed to build: The command '/bin/sh -c bundle install' returned a non-zero code: 18
要するに、Gemfileで指定してるバージョンとアンタの環境のRubyバージョンが違ってまっせ、ということなんですが、これを解決するのにハマった。
解決プロセス
バージョン調査
バージョン違いまっせと言われているので、まずRubyのバージョンを確認するわけですが、この時にローカル環境のバージョンを確認したのが良くなかった。
コンテナ初級者あるある。
$ which ruby
/Users/username/.rbenv/shims/ruby
(デフォルトのパスではなく)rbenvで指定されたパスを指している。
$ ruby -v
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-darwin18]
RubyのバージョンはGemfileの記述と同じく 2.6.0 である。
$ rbenv versions
system
2.3.0
2.4.1
2.5.1
2.5.3
* 2.6.0 (set by /Users/username/Work/training/docker-begin/.ruby-version)
そもそもruby 2.6.3 はインストールすらされていない!
なんでだ!キーッ!!となったわけですが、、
そういや、コンテナに環境作るんだからローカルのインストール状況関係ないよね?
と思い直したのでした。
解決方法
DockerfileのFROM句では、マイナーバージョンを明示しない限り最新版が指定されるらしい。
例えば FROM ruby:2.6
とすると、その時最新バージョンである 2.6.3
と認識される模様。
ソースは自身の試行錯誤
Dockerfileを確認するとまさに 2.6
としていたため、下記のように明示してやることで無事 docker-compose build
出来たのでした。
FROM ruby:2.6.0
rails server 立ち上がってない問題
事象
無事手順を終えウェルカムページが見れる状態になったハズなのですが、どういう訳か localhost:3000
にアクセス出来ない。
コンテナは問題なく立ち上がっているはずなのに...
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
docker-begin_db_1 docker-entrypoint.sh postgres Up 5432/tcp
docker-begin_web_1 entrypoint.sh bash -c rm - ... Up 0.0.0.0:3000->3000/tcp
なぜだ。
解決プロセス
docker logsしてみる
こんな時には docker logs
するといいよ、とどこかの誰が言っていたのでやってみる。
$ docker logs docker-begin_web_1
=> Booting Puma
=> Rails 6.0.0 application starting in development
=> Run `rails server --help` for more startup options
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment
Exiting
/usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:91:in `rescue in load': Webpacker configuration file not found /myapp/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /myapp/config/webpacker.yml (RuntimeError)
from /usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:87:in `load'
from /usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:84:in `data'
from /usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:80:in `fetch'
from /usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:39:in `public_path'
from /usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:43:in `public_output_path'
from /usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/configuration.rb:47:in `public_manifest_path'
from /usr/local/bundle/gems/webpacker-4.0.7/lib/webpacker/manifest.rb:83:in `load'
:
(中略)
:
あれ、rails serverが立ち上がってない...
開発環境に config/webpacker.yml
が定義されていない??
Webpackerをインストール
どうやら、Rails6 ではWebpacker がデフォルトで導入されるようになったらしい。
てことは、Webpackerをインストールしてやらないとrails serverも立ち上がらないということなのかな?
ということで、Webpackerをインストールするために必要なyarnであったりNode.jsであったりをインストールするぞ!という命令をDockerfileに書いてやる。
FROM ruby:2.6.0
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
########################################################################
# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
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 && \
apt-get update && apt-get install -y yarn
# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
apt-get install nodejs
#######################################################################
:
(中略)
:
そしてWebpackerをインストール。
$ docker-compose run web bundle exec rails webpacker:install
Starting docker-begin_db_1 ... done
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment
create config/webpacker.yml
Copying webpack core config
create config/webpack
create config/webpack/development.js
create config/webpack/environment.js
create config/webpack/production.js
create config/webpack/test.js
:
(中略)
:
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
Webpacker successfully installed 🎉 🍰
問題なくインストール出来たのでもう一度コンテナを起動!
無事スタートラインに立つことが出来たのでした
※その後、ついでにRubyのバージョンを 2.6.3
に上げてもう一度同様の手順を試しました。