LoginSignup
2
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-25

はじめに

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 /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秒)

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

2
4
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
2
4