はじめに
dockerizeを利用してコンテナの立ち上げ順を制御したので記事にしたいと思います。docker-composeを使用してRails+mysqlのコンテナを立ち上げた際に、Mysqlのコンテナが立ち上がる前にrailsサーバーを立ち上げようとして、エラーでコンテナが立ち上がらないということがあったのでodckerizeを使用して確実にコンテナが立ち上がるようにしました。(下のようなエラー)
can't connect to mysql server on 'db' (115)
dockerizeの詳細はこちらを参照ください。
https://github.com/jwilder/dockerize
なぜdockerizeが必要?
docker-composeの公式にもあるとおり、depens_onでコンテナの依存関係を指定しても、コンテナ内のサービスの準備が整うまでは待ってくれない。その為、コンテナ内のサービスが受け入れる準備が整うまで待つ必要があります。その待つ動作をdockerizeがしてくれます。
http://docs.docker.jp/compose/startup-order.html
環境
今回は自分が以前記事にしたRails+Mysqlの環境で行いました。
Dockerを使用して既存のRailsプロジェクト開発環境構築してみた
Docker+Rails+HeadlessChromeでRSpecのSystem Testしてみた
1.dockerizeのダウンロード
dockerizeのパッケージをrails用のdockerfaile内でダウンロードします。
wgetから下三行目と環境変数ENV DOCKERIZE_VERSION v0.6.1を追記します。
#既存のプロジェクトのrubyのバージョンを指定FROM ruby:2.6.3 ENV DOCKERIZE_VERSION v0.6.1#パッケージの取得RUN apt-get update &&\
apt-get install-y--no-install-recommends\
nodejs \
mariadb-client \
build-essential \
wget \
&& wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&&tar-C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&&rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& apt-get clean \
&&rm-rf /var/lib/apt/lists/*WORKDIR /myprojectCOPY Gemfile /myproject/GemfileCOPY Gemfile.lock /myproject/Gemfile.lockRUN gem install bundler
RUN bundle install--without production
COPY . /myproject
2docker-composeの修正
docker-compose内のrailsサーバーを立ち上げるときのコマンドに「dockerize -wait tcp://db:3306」を加えます。タイムアウトまでの時間も変えることができます。(デフォルトは10秒)
version:'3'services:db:image:mysql:5.7command:mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ciports:-'3306:3306'environment:MYSQL_DATABASE:docker_developmentMYSQL_ROOT_PASSWORD:passwordMYSQL_USER:rootMYSQL_PASSWORD:passwordweb:build:context:.dockerfile:Dockerfilecommand:dockerize -wait tcp://db:3306 -timeout 5s bundle exec rails s -p 3000 -b '0.0.0.0'tty:true#pry-byebugを使えるようにするstdin_open:truedepends_on:-dbports:-"3000:3000"volumes:-.:/myproject:cached
これでコンテナを立ち上げます。
docker-compose build
dokcer-compose up -d
ログをみてみるとこのようにdb側が受入可能か確認してからrailsサーバーを立ち上げるようになりました。
web_1 | 2020/04/25 03:34:09 Waiting for: tcp://db:3306
web_1 | 2020/04/25 03:34:09 Problem with dial: dial tcp 192.168.0.3:3306: connect: connection refused. Sleeping 1s
web_1 | 2020/04/25 03:34:10 Connected to tcp://db:3306
web_1 | => Booting Puma
web_1 | => Rails 5.1.6 application starting in development
終わりに
今回のようにdbが立ち上がるのを待つという使い方以外にも、http通信ができるようになるまで待つとか、特定のファイルができるまで待つとか使い方があるようです。最後までお読みいただきありがとうございました。