1
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-03

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

# (1) コンテナから抜ける
$ 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
初心者向けdocker-composeコマンド逆引き
docker-compose コマンドまとめ

dockerの動作が遅い場合

Macのdockerが遅いストレスから解放されよう

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.
"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?
"mini_racer"と言うgemを入れると直るらしい

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

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には以下のように記載されていた

source 'https://rubygems.org'
ruby '2.5.1'
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 とかの違いを理解できていなかったのでまとめてみた

キャッシュって何?
Dockerは一度ビルドするとキャッシュというのが作成されます。ご存知グーグルクロームとかのブラウザにも同じ機能がありますね。キャッシュがあると2回目以降にビルドするときに、速やかに処理をすることができるわけです。

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

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

古いruby image があった場合

対処法1

# キャッシュを使わずに、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

以上

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2