多くの場合、プログラムはソフトウェアにバンドルされた構成を通じて操作を制御し、環境変数を使用すると、ユーザーは実行時にそれらを設定できます。ただし、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は複雑であり、環境変数を操作する方法はたくさんあります。詳細については、ポッドへのデータの挿入に関するガイドをご覧ください。