#はじめに
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 /myproject
COPY Gemfile /myproject/Gemfile
COPY Gemfile.lock /myproject/Gemfile.lock
RUN 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.7
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
ports:
- '3306:3306'
environment:
MYSQL_DATABASE: docker_development
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: root
MYSQL_PASSWORD: password
web:
build:
context: .
dockerfile: Dockerfile
command: dockerize -wait tcp://db:3306 -timeout 5s bundle exec rails s -p 3000 -b '0.0.0.0'
tty: true #pry-byebugを使えるようにする
stdin_open: true
depends_on:
- db
ports:
- "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通信ができるようになるまで待つとか、特定のファイルができるまで待つとか使い方があるようです。最後までお読みいただきありがとうございました。