こんにちは、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で動かす!」でした。