Doppler : DockerにおけるApacheとModnum WSGIを用いたPython Djangoアプリケーションのための環境変数の設定方法



環境変数を使用してdjangoや他のPythonアプリケーションを設定するのは素晴らしいですが、DockerでApacheとModCount WSGIでそれらを使用するのはトリッキーなことです.
だからこそ、このステップバイステップのチュートリアルとsample application つの場所で必要なすべての情報を入れてください.
このチュートリアルはDockerとDjango用ですが、仮想マシンまたは別のPythonフレームワークを使用しているかどうか、同じ手順が適用されます.
好むだけでコードを読むか?添付のリポジトリにhttps://github.com/DopplerUniversity/django-apache-mod-wsgi

環境変数、Apacheと


Domangoのような、PythonのWSGI互換フレームワークをModClose WSGIでホストしている場合、OSで設定された環境変数だけです.environ辞書は、Apacheを起動するスクリプトの環境に存在するものです.しかし、Apacheのサービスマネージャの設定(例えばsystemdやsystemctl)を台無しにするのではなく、より良い方法があります.
ほとんどのApacheディストリビューションでは、MoMount WSGIなどのモジュールで利用できる環境変数を設定する目的でシェルスクリプトを提供しています.
このシェルスクリプトの位置を知ることは、Linuxディストリビューションによって異なるかもしれません.例えば、
  • Debian/Ubuntu :/etc/apache 2/envvars
  • centos :/etc/sysconfig/httpd
  • 私たちはpython:3.9-slim-buster Docker image Debianベースです.

    環境変数ファイルへのapp - configと秘密の追加


    基本的に秘密をキー/値のペアとして取り込んで、典型的なシェル環境変数の形式でenvvarsファイルに書きこみます.
    export FIRST_NAME="The"
    export LAST_NAME="Mandalorion"
    
    しかし、どこから、どのように我々はアプリの設定と秘密を取得するファイルを入力するには?
    私はドップラーの開発者の提唱者として、私はDoppler CLI 例は、“フェッチの秘密は、その後、ファイルに追加”の力学は簡単に適応することができます.
    まず、ドップラーであなたのプロジェクトを設定する必要がありますし、次のボタンを使用すると、一緒に従うことを開始する場合を得ることができます.

    次に、ドッキングCLIをドロップスコンテナ内で使用して秘密を取得しますService Token value ):
    # Transform JSON key:value pairs into export statements using jq
    if [ -n "$DOPPLER_TOKEN" ]; then
        echo '[info]: Appending environment variables to /etc/apache/envvars using Doppler CLI'
        doppler secrets download --no-file | jq -r $'. | to_entries[] | "export \(.key)=\'\(.value)\'"' >> /etc/apache2/envvars
    fi
    
    私は1つの引用符ではなく、値の周りの二重引用符を使用している注意?
    それはあなたのために使用することができますDopplerでJSONなどの二重引用符で秘密を格納する柔軟性を与えるので、それはですdynamically set Django's ALLOWED_HOSTS 任意の環境のために動的に設定します.
    ALLOWED_HOSTS = json.loads(os.environ['ALLOWED_HOSTS'])
    
    また、を使用することができます.envファイルI wouldn't recommend it 代わりに、Aを使ってみるsecrets manager .
    しかし、それを脇に、ここでどのようにあなたはそれを使用することができますです.ENVファイル
    if [ -f "$PWD/.env" ]; then
        echo '[info]: Appending environment variables to /etc/apache/envvars from .env file'
        cat "$PWD/.env" >> /etc/apache2/envvars
    fi
    
    ApacheからModHorse WSGIまでの環境変数を渡す方法を知っているので、Dockerでこの作業を進めましょう.

    のためのDocker設定


    Apacheを使用してPythonのdjangoアプリケーションを構成するタスクを破壊しましょう.
  • カスタムスタートスクリプト
  • アパッチサイト
  • Dockerfile
  • 場合は、作業コードの例を参照してくださいhttps://github.com/DopplerUniversity/django-apache-mod-wsgi
    これはDockerやApacheのチュートリアルではないので、私はあまり深く深くDockerfileやApacheのサイトの設定ファイルに潜入することはありませんが、質問を持っている場合はDoppler community forum そして、あなたを助けることができます.

    1 .カスタムスタートスクリプト


    dockerでのアプリケーションの実行は、通常CMDを設定する場合です.
    CMD ["python", "src/app.py"]
    
    しかし、我々が最初に環境変数を/etc/apache2/envvars Apacheを実行する前に.
    複数のコマンドが必要なので、カスタムスクリプトを作成します.
    #!/bin/bash
    
    # apache-doppler-start
    
    set -e
    
    echo 'ServerName localhost' >> /etc/apache2/apache2.conf # Silence FQDN warning
    
    # Doppler CLI
    if [ -n "$DOPPLER_TOKEN" ]; then
        echo '[info]: Appending environment variables to /etc/apache/envvars from Doppler CLI'
        doppler secrets download --no-file | jq -r $'. | to_entries[] | "export \(.key)=\'\(.value)\'"' >> /etc/apache2/envvars
    fi
    
    # Mounted .env file
    if [ -f "$PWD/.env" ]; then
        echo '[info]: Appending environment variables to /etc/apache/envvars from .env file'
        cat "$PWD/.env" >> /etc/apache2/envvars
    fi
    
    # Run Apache
    apache2ctl -D FOREGROUND
    

    Apacheサイトの設定


    以下は、DjangoアプリケーションのApacheサイト設定ファイルの例です.
    # wsgi.conf
    <VirtualHost *:80>
        ServerName django-apache-mod-wsgi
        ServerAlias django-apache-mod-wsgi
        ServerAdmin webmaster@doppler
    
        # Defining `WSGIDaemonProcess` and `WSGIProcessGroup` triggers daemon mode
        WSGIDaemonProcess django-apache-mod-wsgi processes=2 threads=15 display-name=%{GROUP} python-path=/usr/local/lib/python3.9/site-packages:/usr/src/app    
        WSGIProcessGroup django-apache-mod-wsgi
        WSGIScriptAlias / /usr/src/app/doppler/wsgi.py
    
        <Directory /usr/src/app/doppler/>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
    
        # Redirect all logging to stdout for Docker
        LogLevel INFO
        ErrorLog /dev/stdout
        TransferLog /dev/stdout
    </VirtualHost>
    

    dockerfile


    DockerFileは、Djangoのソースコード、カスタムスクリプト、およびApacheサイトをコピーする前に、Doppler CLIとApache依存関係をインストールするのが妥当です.
    FROM python:3.9-slim-buster
    
    ENV PYTHONUNBUFFERED 1
    ENV PYTHONDONTWRITEBYTECODE 1
    
    # Install Doppler CLI and related dependencies
    RUN apt-get -qq update && apt-get install -y apt-transport-https ca-certificates curl gnupg jq && \
    curl -sLf --retry 3 --tlsv1.2 --proto "=https" 'https://packages.doppler.com/public/cli/gpg.DE2A7741A397C129.key' |  apt-key add - && \
    echo "deb https://packages.doppler.com/public/cli/deb/debian any-version main" | tee /etc/apt/sources.list.d/doppler-cli.list && \
    apt-get -qq update && apt-get install doppler
    
    # Install Apache and related dependencies
    RUN apt-get install --yes apache2 apache2-dev libapache2-mod-wsgi-py3 && \
        apt-get clean && \
        apt-get remove --purge --auto-remove -y && \
        rm -rf /var/lib/apt/lists/*
    
    WORKDIR /usr/src/app
    
    COPY requirements*.txt .
    RUN pip install --quiet --no-cache-dir --upgrade pip && \
        pip install --quiet --no-cache-dir -r requirements.txt
    
    # Application source
    COPY src/ ./
    
    # Custom CMD script
    COPY apache-doppler-start /usr/local/bin/
    
    # Apache site config
    COPY wsgi.conf /etc/apache2/sites-enabled/000-default.conf
    
    EXPOSE 80 443
    
    # https://httpd.apache.org/docs/2.4/stopping.html#gracefulstop
    STOPSIGNAL SIGWINCH
    
    CMD ["apache-doppler-start"]
    
    すべての部分で、私たちはDockerイメージを構築することができますsample repository 続く
    docker image build -t django-apache-mod-wsgi:latest .
    
    今、我々はコンテナを実行する準備が整いました!

    DjangoアプリケーションをApacheとDrokerで実行する


    それでは、ドップラーの例から始めましょう.envファイル.
    Dopplerを使用すると、最初にDopplerRankトークン環境変数をService Token . これは、プロダクション環境で特定のDoppler設定への読み取り専用アクセスを提供するものです.
    通常、これはあなたの配備環境(例えばGithubアクション秘密)によって安全に設定されますが、完全性とシンプルさのために、以下のように手動で設定します.
    export DOPPLER_TOKEN="dp.st.xxxx" # Service token value created from Doppler dashboard
    
    コンテナを実行します
    docker container run \
        -it \
        --init \
        --name doppler-apache-mod-wsgi \
        --rm \
        -p 8080:80 \
        -e DOPPLER_TOKEN="$DOPPLER_TOKEN" \
        django-apache-mod-wsgi
    

    . envファイル


    を実行します.envファイルのバージョンは、サンプルを使用します.からのenvファイルsample repository :
    # sample.env
    export DJANGO_SETTINGS_MODULE='doppler.settings'
    export DEBUG='yes'
    export ALLOWED_HOSTS='["*"]'
    export SECRET_KEY='bf5e1b31-6ba7-48e2-9175-f2293671e6df'
    
    次に、コンテナを実行します.
    docker container run \
        -it \
        --init \
        --name dotenv-apache-mod-wsgi \
        --rm \
        -v $(pwd)/sample.env:/usr/src/app/.env \
        -p 8080:80 \
        django-apache-mod-wsgi
    

    概要


    最後にそれを作るの良い仕事!
    ここでは、Apacheとアプリケーションの設定と秘密の環境変数を使用してDockerで実行しているModCount WSGIでホストされているPythonアプリケーションを設定する方法を知っています.
    フィードバックは歓迎され、あなたは私たちに到達することができますCommunity forum , または私にメールを送ってください[email protected] .