🐍

【Python】dockerでpython-dotenvを実装する

2024/07/04に公開

はじめに

Pythonでpython-dotenvを用いて機密情報を管理する方法を以下にまとめている。

動作環境

  • windows
  • python3
  • docker
  • vscode

1..envファイルの作成

ターミナル(powershell)
New-Item .env
出力結果
$ New-Item .env
    ディレクトリ: C:\Desktop\test-python

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/07/03     22:50              0 .env

2..envファイルの編集(機密情報をキーと値のペアで記述)

# 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

3..gitignoreファイルの作成

ターミナル(powershell)
New-Item .gitignore

4..gitignoreファイルの編集

.gitignore
.env

5.requirements.txtファイルを編集

requirements.txtファイル内にpython-dotenvと記載する。
Django>=3.2,<4.0
python-dotenv

6.Dockerfileの編集およびpython-dotenvパッケージのインストール

# ベースイメージとして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"]

7.docker-compose.ymlの編集

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

9.settings.py.envファイルを読み込む処理を追加

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