0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[04] jwilder/dockerize を使ってセットアップ処理を改良する

Last updated at Posted at 2021-07-12

はじめに

Docker (docker-compose)と Linux に標準で搭載されているシェルを組み合せて、
下記 概要に挙げた Django 環境を 1コマンドで即座に立ち上げるためのコードとその解説です.

本記事の内容は、Zenn で書籍として販売している内容と同一です.
Zenn でも書籍の内容は全て無料公開しています.

次の順でコードを作成してください.
動作するコードが作成できるように可能な限り注意を払って執筆しました.

[01] デフォルト環境 runserver + SQLite3 の構築
[02] SQLite3 を PostgreSQL へ置き換える
[03] Django アプリの立ち上げもさせる
・本記事の内容

概要

今回は下図・下表の環境を構築する. (前章からの変更点は🔥である)
前章からの具体的な変更点としては次である.
・セットアップ時の Django や PostgreSQL コンテナの起動待ちの sleep を廃止する.
・sleep の代わりに「jwilder/dockerize」を使って Django や PostgreSQL コンテナ起動を即座に検知させる.

概念図

image.png

コンテナ内の構成

項目 補足
Python バージョン3.8.3 python:3.8.3-slim-buster を使う
Django バージョン3.0.7
アプリサーバ runserver 8000番ポートを使用する
データベース PostgreSQL 12.0 ポートは次の通り
・ホスト側「53432」
・コンテナ側「5432」
管理者アカウントは次の通り
・アカウント「admin
・パスワード「admin
settings.py ホスト上の ./web/assets/settings.py が、
コンテナ内に /usr/src/app/config/settings.py
として配置される.
Django admin ページ 管理者アカウントは次の通り
・アカウント「admin
・パスワード「admin
アプリケーション 「shop」 各ユーザが使用したいアプリに置き換えてほしい
コンテナ起動確認ツール🔥 jwilder/dockerize🔥

特記事項

jwilder/dockerize についての参考情報

jwilder/dockerize はコンテナの準備完了を検知するソフトウェアである.

参考 URL
https://labs.cybozu.co.jp/blog/akky/2017/12/let-dockerize-command-wait-other-container/
https://qiita.com/Aruneko/items/971e65a945d23f7bb8b6

セットアップコード

全文

前章で作成したコードに対して、本記事の内容を適用してください.

web/assets/settings.py より、「DEBUG = True」のみセットアップできることを確認している.

ファイル構成

上記 GitHub からコードを取得してきた直後の構成である.
前章から変更が生じたファイルには🏷️を、新規作成については🆕を付与している.

.
|-- db
|   `-- Dockerfile
|-- docker-compose.yml 🏷️
|-- setupapp.sh 🏷️........... セットアップスクリプト
`-- web
    |-- Dockerfile
    `-- assets .............. コンテナへコピーされるデータ
        |-- entrypoint.sh
        |-- requirements.txt
        |-- sample
        |   `-- shop
        |       |-- admin.py
        |       `-- models.py
        `-- settings.py

解説

docker-compose.yml

jwilder/dockerize は docker-compose.yml に書くことでコンテナ間のネットワーク連携が容易になる

--- docker-compose.yml.ORIG
+++ docker-compose.yml
@@ -27,3 +27,7 @@
         POSTGRES_USER: 'admin'
         POSTGRES_PASSWORD: 'admin'
         PGDATA: '/data'
+  dockerize:
+    image: jwilder/dockerize
+    container_name: jwilder_dockerize

setupapp.sh

■ 「jwilder/dockerize」コンテナから Django コンテナに対して疎通確認をする.
   ・リクエスト先は「ルート」すなわち http://localhost:8000 とする.
   ・Django が起動したか否かの判定条件として manage.py の有無を見る必要が無くなる.
   ・Django 起動までの待機時間を推測しなくて済む.

■ 「jwilder/dockerize」コンテナから PostgreSQL コンテナに対して疎通確認をする.
   ・リクエスト先は tcp://db:5432 とする.

■ 「jwilder/dockerize」が所定時間内に Django や PostgreSQL と疎通できなければエラー終了させる.
   ・「jwilder/dockerize」は疎通できなかった場合は 非0 を返す.
   ・そこで、エラー終了を実現するために「set -e」を用いる.

■ 「jwilder/dockerize」の通信周期、上限時間などは下記コード内のコメントを参照してほしい.

--- setupapp.sh.ORIG
+++ setupapp.sh
@@ -27,20 +27,14 @@
 # Docker コンテナ起動を行う. 
 docker-compose up -d
 
-# 起動完了を待つ. (== entrypoint.sh の成功を待つ)
-sleep 2
+# 次の jwilder/dockerize でタイムアウトになった場合にセットアップスクリプトを停止させるようにする.
+set -e
 
-# manage.py が作成されていなければ Django のプロジェクト作成に失敗したとみなす
-test ! -f ./web/app/manage.py && {
-  echo "ERROR: Django のプロジェクト作成に失敗した"
-  exit 2
-}
+# 0.5秒周期で Django と PostgreSQL コンテナから応答があるまで待機する. (上限 1分間)
+docker-compose run --rm dockerize sh -c 'dockerize -wait http://web:8000 -wait tcp://db:5432 -timeout 1m -wait-retry-interval 0.5s'
 
-# コンテナ内でのマイグレーション終了を待つ.
-# なお、ここで 待機時間を取らないと次のエラーが出現してしまう.
-#「django.db.utils.IntegrityError: duplicate key value violates unique constraint "pg_type_typname_nsp_index"」
-# [参考] https://www.odin.hyork.net/write/write0206.html
-sleep 4
+# jwilder/dockerize の処理が済んだので、set -e を無効にする.
+set +e
 
 # 「Django管理サイト」の管理者アカウントを作成する. (ID「admin」, PW「admin」とする)
 docker-compose exec web bash -c "python manage.py makemigrations"

セットアップ方法

次の通りコマンドを実行する.

$ ./setupapp.sh

セットアップ後

ファイル構成

$ tree . --charset=c -a 
.
|-- db
|   |-- Dockerfile
|   |-- data [error opening dir]
|   `-- init
|-- docker-compose.yml
|-- setupapp.sh
`-- web
    |-- Dockerfile
    |-- app
    |   |-- .settings.py
    |   |-- config
    |   |   |-- __init__.py
    |   |   |-- asgi.py
    |   |   |-- settings.py
    |   |   |-- urls.py
    |   |   `-- wsgi.py
    |   |-- entrypoint.sh
    |   |-- manage.py
    |   `-- shop
    |       |-- __init__.py
    |       |-- admin.py
    |       |-- apps.py
    |       |-- migrations
    |       |   |-- 0001_initial.py
    |       |   `-- __init__.py
    |       |-- models.py
    |       |-- tests.py
    |       `-- views.py
    `-- assets
        |-- entrypoint.sh
        |-- requirements.txt
        |-- sample
        |   `-- shop
        |       |-- admin.py
        |       `-- models.py
        `-- settings.py

動作確認方法

次の点を確認すれば良い.

✔ Dockerコンテナが次のように起動していること

コンテナ「jwilder_dockerize」は使い捨て型なので、Exit 2 は意図した結果であり問題無し.

$ docker-compose ps
      Name                     Command               State             Ports         
-------------------------------------------------------------------------------------
jwilder_dockerize   dockerize --help                 Exit 2                          
mydjango307         /usr/src/app/entrypoint.sh ...   Up       0.0.0.0:8000->8000/tcp 
mypostgres12        docker-entrypoint.sh postgres    Up       0.0.0.0:53432->5432/tcp

http://localhost:8000 にアクセスして次の画面が表示されること.

image.png


http://localhost:8000/admin にアクセスして、アカウント「admin」、パスワード「admin」でログインできること.

image.png


以上.

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?