Rails6の開発環境をDockerで構築しようとしたらドハマりした件

## 概要
Dockerでの開発環境構築に慣れていない私は、練習がてら公式の手順を元にRailsの開発環境を構築してみることに。
https://docs.docker.com/compose/rails/

その時ハマった事象と解決方法のメモ。

## 落とし穴
最近 [Rails6がリリース](https://railsguides.jp/6_0_release_notes.html) されたということで、せっかくだから使ってみるかな！
→それが悲劇の始まりとは知る由もなく...

## Your Ruby version is 2.6.3, but your Gemfile specified 2.6.0 問題
### 事象
[Build the Project](https://docs.docker.com/compose/rails/#build-the-project) の手順で`docker-compose build` した時に出たエラーメッセージ。

``` bash
$ 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のバージョンを確認するわけですが、この時にローカル環境のバージョンを確認したのが良くなかった。
コンテナ初級者あるある。

``` bash
$ which ruby
/Users/username/.rbenv/shims/ruby
```

(デフォルトのパスではなく)rbenvで指定されたパスを指している。

``` bash
$ ruby -v
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-darwin18]
```
RubyのバージョンはGemfileの記述と同じく 2.6.0 である。

``` bash
$ 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` と認識される模様。
:point_right: ソースは自身の試行錯誤

Dockerfileを確認するとまさに `2.6` としていたため、下記のように明示してやることで無事 `docker-compose build` 出来たのでした。

``` Dockerfile
FROM ruby:2.6.0
```

## rails server 立ち上がってない問題
### 事象
無事手順を終え[ウェルカムページ](https://docs.docker.com/compose/rails/#view-the-rails-welcome-page)が見れる状態になったハズなのですが、どういう訳か `localhost:3000` にアクセス出来ない。

<img width="1195" alt="localhost 2019-08-20 19-21-39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110452/e455f262-66f6-2c11-ff3c-fce4efd8fe13.png">


コンテナは問題なく立ち上がっているはずなのに...

``` bash
$ 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` するといいよ、とどこかの誰が言っていたのでやってみる。

``` bash
$ 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 がデフォルトで導入される](https://railsguides.jp/6_0_release_notes.html#railties-%E4%B8%BB%E3%81%AA%E5%A4%89%E6%9B%B4)ようになったらしい。

てことは、Webpackerをインストールしてやらないとrails serverも立ち上がらないということなのかな？

ということで、Webpackerをインストールするために必要なyarnであったりNode.jsであったりをインストールするぞ！という命令をDockerfileに書いてやる。

``` 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をインストール。

``` bash
$ 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 🎉 🍰
```

問題なくインストール出来たのでもう一度コンテナを起動！

<img width="1195" alt="Ruby on Rails 2019-08-20 19-20-06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110452/d1c38ff1-9866-ec04-1941-33722a3265ac.png">


無事スタートラインに立つことが出来たのでした:clap:

※その後、ついでにRubyのバージョンを `2.6.3` に上げてもう一度同様の手順を試しました。

##### 参考
[Rails(Docker)でwebpackがインストールできない](https://qiita.com/shunichi_com/items/6a1980f0cdf431c0abba)