多くの場合、プログラムはソフトウェアにバンドルされた構成を通じて操作を制御し、環境変数を使用すると、ユーザーは実行時にそれらを設定できます。ただし、Dockerコンテナーでプロセスを実行すると事態が複雑になるため、環境変数をコンテナーに渡すにはどうすればよいですか?
環境変数は何に使用されますか?
環境変数を使用すると、構成をアプリケーションの実行可能ファイルから切り離すことができます。たとえば、本番データベースのパスワードをコードベースに保存したくない場合は、Gitから表示され、コードにアクセスできる人は誰でもデータベースを停止する可能性があります。
代わりに、単純なキーと値のペアを格納する環境変数を使用して設定し、同じシェルセッションで実行されている任意のアプリケーションの値にアクセスできるようにします(グローバルにアクセスすることはできません)。これには、環境ごとに異なる構成を簡単に定義できるという利点もあります。たとえば、開発データベースと本番データベースに別々のキーを使用したり、別のAPIエンドポイントを使用したりします。
Dockerコンテナーのこれらの変数の設定は、CLI引数.envを使用する3つの主な方法で実行できます。 設定ファイル、またはdocker-compose 。
コマンドライン引数付き
Dockerコンテナーを起動するために使用されるコマンド、docker run 、ENV変数を引数として受け入れます。 -eで実行するだけです フラグ、--envの省略形 、およびkey =valueペアを渡します:
sudo docker run -e POSTGRES_USER='postgres' -e POSTGRES_PASSWORD='password' ...
また、そのコマンドを実行している環境にこれらの環境変数がすでに設定されている場合は、名前で直接渡すことができます:
// set variable POSTGRES_PASSWORD='password' // use it later docker run -e POSTGRES_PASSWORD -e POSTGRES_USER ...
.envファイルによる追加のセキュリティ
CLI引数を使用して変数を渡すことはうまく機能しますが、欠点があります。これらの変数はホストから表示されます。それらはコマンド履歴に記録され、起動されたプロセスのプロセスリストに表示されます。
Linuxには、このためのアクセス許可を管理するための組み込みの方法、つまりファイルアクセスがあります。変数を.envに保存する fileを使用すると、ファイル権限(chmod)を使用してそのファイルへのアクセスを制御できます。 、chown 。
.envを作成します 次の形式の変数を含むファイルで、それぞれが新しい行にあります:
POSTGRES_PASSWORD='password' POSTGRES_USER='postgres' APPLICATION_URL='example.com'
次に、それをdocker runに渡します --env-fileを使用 フラグ:
docker run --env-file ./envfile ...
Docker-Composeを使用
もちろん、多くの人はdocker runでDockerコンテナを直接起動しません 、代わりにdocker-composeを使用することを選択します すべてが単一のアプリケーションを表す複数のコンテナの構成を処理するファイル。
この方法で起動されたコンテナに環境変数を渡すには、セッションの変数をDockerコンテナに渡すように作成ファイルを構成する必要があります。この構成はここでPOSTGRES_USERを渡します ビルド環境とランタイム環境の両方に対して変数であり、存在しない場合はデフォルト値を設定します。
version: '3.1'
services:
my-service:
build:
context: .
args:
- POSTGRES_USER=${POSTGRES_USER:-default}
environment:
- POSTGRES_USER=${POSTGRES_USER:-default}
docker-compose upを実行する前に、環境変数を設定する必要があります。 そうしないと、それらにアクセスできなくなります。それらを作成ファイルに保存することもできますが、通常は追跡およびバージョン管理されるため、環境変数の目的が損なわれます。
Kubernetesを使用
Kubernetesは、ネットワーク全体で数百のコンテナを実行できるオーケストレーションシステムです。引き続きDockerを使用しますが、構成に触れるだけなので、環境変数を直接渡すことはできません。
代わりに、ポッドの構成でそれらを定義できます:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- ...
env:
- name: SERVICE_PORT
value: "80"
- name: SERVICE_IP
value: "172.17.0.1" Kubernetesは複雑であり、環境変数を操作する方法はたくさんあります。詳細については、ポッドへのデータの挿入に関するガイドをご覧ください。