開発日記

出退勤を記録するアプリをDockerで動かす!

こんにちは、MSKです。
前回DjangoをDockerで動かすことができたので、今回は作ってきた出退勤のアプリをDockerで動かすことをやってみたいと思います。

関連する記事は以下になります。
出退勤の時間を記録するWebアプリの作り始め!
出退勤時間を記録するアプリのAPIを作る! 
出退勤時間を記録するアプリのユーザー登録と認証を実装する! 
Djangoの開発環境をDockerで構成してみる!
出退勤を記録するアプリをDockerで動かす!<- この記事はここ!

データベースとしてPostgresqlを使う

よくPostgresqlを使っているので、今回もDocker-ComposeにPostgresqlを組み込んでいきます。

現時点の構成は以下のようになっています。

.
├── app
│   ├── Dockerfile
│   ├── app
│   │   ├── __init__.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── manage.py
│   └── requirements.txt
├── docker-compose.yml
└── web
    └── project.conf

Djangoの設定を環境変数から取るようにする

app/appの中にあるsettings.pyを変更します。
まず、先頭にimport osを入れてください。(環境変数から値を取得するため)

ちょっと悩んでいますが、SECRET_KEYとDATABASESの中身を環境変数から取得するようにします。

from pathlib import Path
import os
~~~ 省略~~~
SECRET_KEY = os.environ.get('SECRET_KEY')
~~~省略~~~
DATABASES = {
    'default': {
        'ENGINE': os.environ.get('DATABASE_ENGIN','django.db.backends.sqlite3'),
        'NAME': os.environ.get('DATABASE_DB',os.path.join(BASE_DIR, 'db.sqlite3')),
        'USER': os.environ.get('DATABASE_USER', 'xxxx'),
        'PASSWORD': os.environ.get('DATABASE_PASSWORD', 'xxxxxxxxxxx'),
        'HOST': os.environ.get('DATABASE_HOST', 'localhost'),
        'PORT': int(os.environ.get('DATABASE_PORT', 'ooooo')),
    }
}

次に、requirements.txtを編集します。
いつもこの記述を忘れて、Docker-compose upの後にDjangoアプリだけがRestartingとなって悩んでいます。
(Postgresqlを使っているのでPython側からアクセスするためのドライバが必要と普通は思いそうなのですが、よく忘れます・・・)

Django==3.1.7
gunicorn==19.9.0
psycopg2==2.8.6

docker-compose.ymlを編集

最終的にはやり方を変えると思いますが、まずはdocker-compose.ymlに環境変数として設定した値を書き込みます。

前に作ったdocker-compose.ymlファイルの中のappの部分を次のように変えました。

app:
    build: ./app
    environment:
      - DEBUG=0
      - SECRET_KEY=---------------------------------------------------
      - DATABASE_ENGIN=django.db.backends.postgresql
      - DATABASE_DB=(データベース名)
      - DATABASE_USER=(ユーザー名)
      - DATABASE_PASSWORD=(パスワード)
      - DATABASE_HOST=db
      - DATABASE_PORT=(ポート番号)
    networks:
      - app_network
    volumes:
      - ./app:/code
    hostname: app-server
    restart: always
    depends_on:
      - db

environment:の部分が環境変数を設定している部分です。
Postgresqlのコンテナと依存関係があるので、depends_onに次に書いていくdbを設定しています。

次にPostgresqlのコンテナについて書いていきます。

db:
    image: postgres:12.0-alpine
    volumes:
      - db_data:/var/lib/postgresql/data/
    networks:
      - app_network
    ports:
      - (ポートの設定)
    environment:
      - POSTGRES_USER=(ユーザー名)
      - POSTGRES_PASSWORD=(パスワード)
      - POSTGRES_DB=(データベース名)

imageファイルをpostgres:12.0-alpineから取ってきています。
環境変数に設定すべき項目はデータベース名・ユーザー名・パスワードです。
その他にも設定できる環境変数がありますが、それはDockerHubを参照してください。

動作確認してみる

ここまで書いたら、動かしてみます。

docker-compose up -d --build

エラーなく立ち上がったら、localhostにブラウザからアクセスしてDjangoのスタートページが表示されたら成功です。

次にスーパーユーザーを作って、管理者ページに入ってみます。
スーパーユーザーを作る前にmigrationを行います。

docker-compose exec app python manage.py makemigrations
docker-compose exec app python manage.py migrate
docker-compose exec app python manage.py createsuperuser

スーパーユーザーまで作れたら、localhost/admin/にアクセスします。
cssを反映させてないので、画面が装飾されていませんが・・・

先ほど作ったスーパーユーザーとそのパスワードを入れて、ログインできたらOKです。

出退勤のアプリを移植する

次に以前に作った出退勤のアプリを移植します。

アプリの作成

次のコマンドでDjangoアプリを作成します。

django-admin startapp api

アプリを作成したら以前に作ったファイルをapiファイルの中にコピーアンドペーストします。

docker起動

上と同じように起動します。

docker-compose up -d --build

migrationなども同じでスーパーユーザーも作っておきます。

docker-compose exec app python manage.py makemigrations
docker-compose exec app python manage.py migrate
docker-compose exec app python manage.py createsuperuser

APIの確認をする前に管理画面などがみにくいので、CSSを反映させときます。

CSSなどを反映させる

settings.pyのSTATIC_URL = ‘/static/’として、appフォルダやwebフォルダと同じ階層にstaticというフォルダを準備します。

最後に次のコマンドを打ちます。

docker-compose exec app python manage.py collectstatic

これで静的ファイルがstaticフォルダに集約されます。

最後に

今回は作ってきた出退勤のDjangoアプリをDockerで起動しました。
起動する際にDjangoがRestartingになり続けて、結構苦労しましたがなんとかバックエンドはできました。

次からはフロントを作っていきます。

最後までご覧いただき、ありがとうございました。
以上、「出退勤を記録するアプリをDockerで動かす!」でした。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。