#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
プロジェクトディレクトリ直下に
#!/bin/bash
set -e
rm -f /myapp/tmp/pids/server.pid
exec "$@"
#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](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 #)
# 例
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には以下のように記載されていた
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を調べているうちに、以下が原因ではないかと推測。
- 以前ruby2.5.8でコンテナを立ち上げていたので、そのイメージが残っていた。
- 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 があった場合
####対処法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
以上