はじめに
より便利によりセキュアなシステムを作る上で環境変数は非常に重要です。
今回はdocker環境での環境変数の扱いかたについて解説していきたいと思います。
目次
環境変数とは
OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために用いられるとのこと。
APIキーやパスワードなどソースコードに直接書かないときに使うことが多いです。またenvファイルは.gitignoreで指定して、github等で公開しないことがほとんどです.
envファイルを用いて環境変数を扱う方法
今回は例としてfastapiでデータベースへ接続を行う際のデータベースの情報を.envファイルで管理します.
まずdockr-compose.ymlに環境変数を参照する先を書きます
docker-compose.yml
version: "3"
services:
api:
env_file:
- ./api/.env
次に.envにデータベースへ接続するための情報を書きます
.env
DB_USER="mysqluser"
DB_PASSWORD="mysqlpass"
DB_HOST="db:3308"
DB_NAME="sample_db"
db.py
os.environ.getで.envに記述した情報を取得します.
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
from dotenv import load_dotenv
import os
load_dotenv()
user = os.environ.get("DB_USER")
password = os.environ.get("DB_PASSWORD")
host = os.environ.get("DB_HOST")
db_name = os.environ.get("DB_NAME")
DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % (
user,
password,
host,
db_name,
)
ENGINE = create_engine(
DATABASE,
echo=True
)
session = scoped_session(
sessionmaker(
autocommit=False,
autoflush=False,
bind=ENGINE
)
)
Base = declarative_base()
Base.query = session.query_property()
dockerfileでENVを用いて環境変数を扱う方法
こちらの方法はシンプルです.主観にはなりますが、envファイルを用いたやり方の方が主流だと思います.
Dockerfile
FROM python:3.7
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
docker-compose.yml
version: "3"
services:
db:
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: sample_db
MYSQL_USER: mysqluser
MYSQL_PASSWORD: mysqlpass
おまけ AWSでの環境変数管理
アプリケーションをAWSでデプロイする際、秘匿したい情報は次のサービスを利用します.
AWS System Manager Parameter Store