Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 21499

dockerizeでコンテナが立ち上がる順番を制御してみた

$
0
0

はじめに

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を追記します。

Dockerfile
#既存のプロジェクトの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秒)

docker-compose.yml
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通信ができるようになるまで待つとか、特定のファイルができるまで待つとか使い方があるようです。最後までお読みいただきありがとうございました。


Viewing all articles
Browse latest Browse all 21499

Latest Images

Trending Articles