🐍
【Python】dockerでpython-dotenvを実装する
はじめに
Pythonでpython-dotenv
を用いて機密情報を管理する方法を以下にまとめている。
動作環境
- windows
- python3
- docker
- vscode
.env
ファイルの作成
1.ターミナル(powershell)
New-Item .env
出力結果
$ New-Item .env
ディレクトリ: C:\Desktop\test-python
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/07/03 22:50 0 .env
.env
ファイルの編集(機密情報をキーと値のペアで記述)
2.# API キー
API_KEY=AIabcdefv-000000000
# その他の機密情報(例:cloud-healthcare-apiの情報)
PROJECT_ID=cloud-healthcare-api
LOCATION=asia-northeast1
DATASET_ID=Healthcare_App_Service
FHIR_STORE_ID=test-data-store
.gitignore
ファイルの作成
3.ターミナル(powershell)
New-Item .gitignore
.gitignore
ファイルの編集
4..gitignore
.env
requirements.txt
ファイルを編集
5.requirements.txtファイル内にpython-dotenvと記載する。
Django>=3.2,<4.0
python-dotenv
Dockerfile
の編集およびpython-dotenv
パッケージのインストール
6.# ベースイメージとしてPython 3.10を使用
FROM python:3.10
# 作業ディレクトリを設定
WORKDIR /app
# 必要なシステムライブラリをインストール
RUN apt-get update && apt-get install -y \
libpq-dev \
gcc \
python3-dev \
&& rm -rf /var/lib/apt/lists/*
# 必要なライブラリをインストールするためのrequirements.txtをコピー
COPY requirements.txt .
# ライブラリのインストール
RUN pip install --upgrade pip \
&& pip install -r requirements.txt ← これが必要
# プロジェクトファイルをコンテナにコピー
COPY . .
# 認証情報ファイルをコピー
COPY service_account_key.json /app/service_account_key.json
# ポート8000を開放
EXPOSE 8000
# コンテナ起動時に実行するコマンド(Django開発サーバーを起動)
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
docker-compose.yml
の編集
7.docker-compose.yml
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
env_file: ← ここが重要
- .env ← ここが重要
networks:
- test-django-project-network
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
ports:
- "5432:5432"
networks:
- test-django-project-network
networks:
test-django-project-network:
8.dockerコンテナの起動
起動済みの場合はdownを実行
docker-compose down
docker-compose up --build
settings.py
で.env
ファイルを読み込む処理を追加
9.settings.pyで定義した機密情報はアプリケーション内でsettingsモジュールをインポートして利用することができる。
# settings.py
import os
from dotenv import load_dotenv
# .env ファイルを読み込む
load_dotenv()
# 機密情報を .env ファイルから取得
API_KEY = os.getenv('API_KEY')
PROJECT_ID = os.getenv('PROJECT_ID')
LOCATION = os.getenv('LOCATION')
DATASET_ID = os.getenv('DATASET_ID')
FHIR_STORE_ID = os.getenv('FHIR_STORE_ID')
# Django の設定
# ...
10.views.pyなどのファイルで環境変数を読み込む
views.py
from django.shortcuts import render, redirect
from django.conf import settings ← この記述が必要(設定ファイルを読み込む)
PROJECT_ID = settings.PROJECT_ID
LOCATION = settings.LOCATION
DATASET_ID = settings.DATASET_ID
FHIR_STORE_ID = settings.FHIR_STORE_ID
# 患者リソースの一覧を取得するビュー関数
def list_patients(request):
if request.method == 'GET':
# settingsファイルで定義したものを呼び出す(=.envファイルから呼び出されている)
fhir_store_name = f"projects/{PROJECT_ID}/locations/{LOCATION}/datasets/{DATASET_ID}/fhirStores/{FHIR_STORE_ID}"
まとめ
Pythonでpython-dotenv
を用いて機密情報を管理する方法は、①.envの作成と機密情報の記載➡②.gitignoreの作成と編集➡③docker関連のファイルの設定でpython-dotenvファイルをインストール➡④Django内のsettings.pyファイル.envの内容を読み込む➡⑤from/importキーワードやsettings.pyファイルから継承した機密情報の設定を用いて行われる。
Discussion