railsにdockerを導入した際のメモと遭遇したエラー

#dockerfile

```Dockerfile
FROM ruby:2.5.1
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN mkdir /myapp
ENV APP_ROOT /myapp
WORKDIR $APP_ROOT
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
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"]
```

#entrypoint.sh
プロジェクトディレクトリ直下に

```entrypoint.sh
#!/bin/bash
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"
```

#docker-compose-yml

```docker-compose.yml
version: '3'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true
    stdin_open: true
    depends_on:
      - db
    ports:
      - "3000:3000"
    volumes:
      - .:/myapp:delegated
  db:
    image: mysql:5.7
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3316:3306'
    volumes:
      - ./db/mysql/volumes:/var/lib/mysql

```

#dockerコマンド関連
```ターミナル
# コンテナ一覧(停止しているもの含め)
$ docker ps -a

# コンテナID一覧
$ docker ps -a -q

# コンテナ削除
$ docker rm [コンテナID]

# （強制的）コンテナ削除
$ docker rm -f [コンテナID]

#コンテナの中に入る
$ docker-compose exec web bash

# （１） コンテナから抜ける
$ exit
　
# (2) コンテナから抜ける
Ctrl + P + Q (コンテナを停止することなく)
```
#docker-compose build, up, start, run の違い
####docker-compose build
imageのみ構築し,コンテナは構築しない。
もちろん、コンテナ起動もしない

####docker-compose up
イメージのキャッシュがあれば、そこからコンテナの構築・起動までを行う。
イメージのキャッシュがなければ、buildでイメージを構築し、コンテナの構築・起動を行う。

####docker-compose start

すでに構築されたコンテナがあれば、それらを起動
（doker-compose stop でコンテナを停止）

####docker-compose run
引数で指定したサービスのコンテナ内でコマンドを実行

```
$ docker-compose run web rails s
$ docker-compose run web rails c

などなど、、、、
```

##dockerコマンドの参考サイト
[https://qiita.com/tegnike/items/bcdcee0320e11a928d46](https://qiita.com/tegnike/items/bcdcee0320e11a928d46 #)
[初心者向けdocker-composeコマンド逆引き](https://qiita.com/okyk/items/a374ddb3f853d1688820 #)
[docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF #)

## dockerの動作が遅い場合

[Macのdockerが遅いストレスから解放されよう](https://qiita.com/ysKey2/items/346c429ac8dfa0aed892 #)

```docker-compose.yml
# 例
services:
  app:
    volumes:
      - .:/project/sample_app:delegated
```

#　遭遇したエラー

## Autoprefixer doesn’t support Node v4.8.2.

```
web_1  | ActionView::Template::Error (Autoprefixer doesn’t support Node v4.8.2. Update it.):
web_1  |     3:   <head>
web_1  |     4:     <title><%= content_for?(:html_title) ? yield(:html_title) : "Japanepa.com" %></title>
web_1  |     5:     <%= csrf_meta_tags %>
web_1  |     6:     <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
web_1  |     7:     <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
web_1  |     8:     <%= Gon::Base.render_data %>
web_1  |     9:     <%= include_gon %>
```
[Autoprefixer doesn’t support Node v4.8.2.](https://logicoffee.hatenablog.com/entry/2018/09/01/200627 #)
"Vender Prefixesを自動でつけてくれるのが, AutoprefixerというGemが Node v4.8.2をサポートしていないと言うこと"

#####1. Autoprefixer doesn’t support Node v4.8.2.への対応策

[Ruby on Rails - Autoprefixer doesn’t support Node v4.9.1. Update it. How to fix?](https://stackoverflow.com/questions/51926146/ruby-on-rails-autoprefixer-doesn-t-support-node-v4-9-1-update-it-how-to-fix #)
"mini_racer"と言うgemを入れると直るらしい

#####2. Autoprefixer doesn’t support Node v4.8.2.への対応策
[Autoprefixer doesn’t support Node v4.8.2. Update it
](https://stackoverflow.com/questions/52708521/autoprefixer-doesn-t-support-node-v4-8-2-update-it #)

```
# 変更前
RUN apt-get update -qq \ && apt-get install -y nodejs postgresql-client

# 変更後
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - && apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
```

##Your Ruby version is 2.5.8, but your Gemfile specified 2.5.1
rubyのバージョンが違うことから発生したエラー
しかし、gemfileとdockerfileには以下のように記載されていた

```Gemfile
source 'https://rubygems.org'
ruby '2.5.1'
```

```Dockerfile
FROM ruby:2.5.1
```
####Your Ruby version is 2.5.8, but your Gemfile specified 2.5.1　への対応策
調べてみると,GemfileとDockerfileでのruby バージョンを一致させる、という解決策しか出ていなかった。
そのため、以下対応策を実行

"dockerのアンインストール、再インストール"

実際これで問題は解決したが、あまりにも強引なやり方でおすすめできない。

#####のちにいろいろdockerを調べているうちに、以下が原因ではないかと推測。
1. 以前ruby2.5.8でコンテナを立ち上げていたので、そのイメージが残っていた。
2. docker-composeした際に、dockerfileに記載された2.5.1のイメージを新たにpullするのではなく、
以前pullしたruby2.5.8のイメージが使われたために、エラーが発生した。

dockerにあまり詳しくないが、rubyのimageがpullされていたら、Dockerfileに記載されたrubyのバージョンに関係なく、使われてしまうものなのか？？


[docker-compose `up` とか `build` とか `start` とかの違いを理解できていなかったのでまとめてみた](https://qiita.com/tegnike/items/bcdcee0320e11a928d46 #)
>キャッシュって何？
Dockerは一度ビルドするとキャッシュというのが作成されます。ご存知グーグルクロームとかのブラウザにも同じ機能がありますね。キャッシュがあると2回目以降にビルドするときに、速やかに処理をすることができるわけです。

>ただ、キャッシュがあると不便なときもあって、それが例えばDockerfileを更新したときなどです。上に紹介したように --no-cache オプションを付けないと、Dockerはキャッシュを使ってimageを構築してしまうので、更新したDockerfileを見てくれず新しいimageが作られません。

やはり、以前のruby2.5.8でコンテナを立ち上げた際のキャッシュが残っていたために、バージョン違いのエラーが出たようだ。

## 古いruby image があった場合
####対処法１

```
# キャッシュを使わずに、docker-compose.ymlで指定したrubyのバージョンで新たにimageをpullする

$ docker-compose build --no-cache
```


####対処法2
古いイメージを削除する

```
# docker image の一覧を表示

$ docker images
> REPOSITORY          TAG                   IMAGE ID            CREATED             SIZE
> ruby                2.5.1                 3c8181e703d2        22 months ago       869MB

# IMAGE ID を指定して、image を削除

$ docker rmi 3c8181e703d2
``` 



以上