回答:
-e
フラグを使用して、環境変数をコンテナに渡すことができます。
起動スクリプトの例:
sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \
-e POSTGRES_ENV_POSTGRES_USER='bar' \
-e POSTGRES_ENV_DB_NAME='mysite_staging' \
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \
-e SITE_URL='staging.mysite.com' \
-p 80:80 \
--link redis:redis \
--name container_name dockerhub_id/image_name
または、コマンドラインに値が表示されないようにしたい場合ps
などは-e
、現在の環境から値を取得できます=
。
sudo PASSWORD='foo' docker run [...] -e PASSWORD [...]
多くの環境変数があり、特にそれらが秘密にされている場合は、env-fileを使用できます。
$ docker run --env-file ./env.list ubuntu bash
--env-fileフラグはファイル名を引数として取り、各行がVAR = VAL形式であることを想定して、-envに渡される引数を模倣します。コメント行の先頭には#のみを付ける必要があります
export PASSWORD=foo
代わりに実行すると、変数がdocker run
環境変数として渡され、docker run -e PASSWORD
機能します。
ここと@errataで述べられているように-e
、docker run ..
コマンドでパラメーターを使用して渡すことができます。
ただし、このアプローチの潜在的な欠点は、資格情報が実行されるプロセスリストに表示されることです。
それをより安全にするには、設定ファイルに資格情報を作成し、実行することがで述べたように、ここで。次に、その構成ファイルへのアクセスを制御して、そのマシンにアクセスできる他のユーザーがあなたの資格情報を見ることができないようにします。docker run
--env-file
--env-file
を使用すると--env
、使用しているシェルの標準的なセマンティクスで引用/エスケープされ--env-file
ますが、値を使用すると、コンテナー内で取得される値が異なります。docker runコマンドはファイルを読み取り、非常に基本的な解析を行って値をコンテナーに渡します。これはシェルの動作とは異なります。一連の--env
エントリをに変換する場合に注意する必要があるのは、ちょっとした落とし穴です--env-file
。
コンテナーを起動する方法として「docker-compose」を使用している場合、実際には、サーバーで定義されている環境変数をDockerコンテナーに渡す便利な方法があります。
あなたにはdocker-compose.yml
、ファイル、あなたは基本的なHAPI-jsからコンテナとコードルックスなどをスピンアップしているとしましょう:
hapi_server:
container_name: hapi_server
image: node_image
expose:
- "3000"
dockerプロジェクトが置かれているローカルサーバーに、hapi-jsコンテナーに渡す「NODE_DB_CONNECT」という名前の環境変数があり、その新しい名前を「HAPI_DB_CONNECT」にしたいとします。次に、docker-compose.yml
ファイルでローカル環境変数をコンテナに渡し、次のように名前を変更します。
hapi_server:
container_name: hapi_server
image: node_image
environment:
- HAPI_DB_CONNECT=${NODE_DB_CONNECT}
expose:
- "3000"
これが、コンテナ内の任意のファイルでデータベース接続文字列をハードコーディングすることを回避するのに役立つことを願っています!
を使用するとdocker-compose
、docker-compose.ymlの環境変数を継承し、続いてによって呼び出されdocker-compose
てイメージをビルドするDockerfileを継承できます。これは、Dockerfile
RUN
コマンドが環境に固有のコマンドを実行する必要がある場合に役立ちます。
(あなたのシェルはRAILS_ENV=development
すでに環境に存在しています)
docker-compose.yml:
version: '3.1'
services:
my-service:
build:
#$RAILS_ENV is referencing the shell environment RAILS_ENV variable
#and passing it to the Dockerfile ARG RAILS_ENV
#the syntax below ensures that the RAILS_ENV arg will default to
#production if empty.
#note that is dockerfile: is not specified it assumes file name: Dockerfile
context: .
args:
- RAILS_ENV=${RAILS_ENV:-production}
environment:
- RAILS_ENV=${RAILS_ENV:-production}
Dockerfile:
FROM ruby:2.3.4
#give ARG RAILS_ENV a default value = production
ARG RAILS_ENV=production
#assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed
#by the subsequent RUN call within the container
ENV RAILS_ENV $RAILS_ENV
#the subsequent RUN call accesses the RAILS_ENV ENV variable within the container
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi
このように、ファイルまたはdocker-compose
build
/ up
コマンドで環境変数を指定する必要はありません。
docker-compose build
docker-compose up
-e
または--env valueを使用して、環境変数を設定します(デフォルト[])。
起動スクリプトの例:
docker run -e myhost='localhost' -it busybox sh
コマンドラインから複数の環境を使用する場合は、すべての環境変数の前に-e
フラグを使用します。
例:
sudo docker run -d -t -i -e NAMESPACE='staging' -e PASSWORD='foo' busybox sh
注:コンテナ名は、環境変数の前ではなく、必ず環境変数の後に置いてください。
多くの変数を設定する必要がある場合は、--env-file
フラグを使用します
例えば、
$ docker run --env-file ./my_env ubuntu bash
その他のヘルプについては、Dockerのヘルプをご覧ください。
$ docker run --help
公式ドキュメント:https : //docs.docker.com/compose/environment-variables/
ubuntu bash
ですか?ubuntuでベースイメージとして作成されたイメージに適用されますか、それともすべてのイメージに適用されますか?
-e
前に引数の後にコンテナ名を置くことについて少し読んでみたいです!彼らがなぜこれを必要としたのか理解することすらできません...
Amazon AWS ECS / ECRの場合、プライベートS3バケットを介して環境変数(特にシークレット)を管理する必要があります。ブログ記事「Amazon S3とDockerを使用してAmazon EC2コンテナサービスベースのアプリケーションのシークレットを管理する方法」を参照してください。
env.sh
ローカルに環境変数があり、コンテナの起動時にそれを設定したい場合は、
COPY env.sh /env.sh
COPY <filename>.jar /<filename>.jar
ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]
このコマンドは、コンテナーをbashシェルで起動し(source
bashコマンドなのでbashシェルが必要です)、env.sh
ファイルをソースし(環境変数を設定)、jarファイルを実行します。
env.sh
このようになり、
#!/bin/bash
export FOO="BAR"
export DB_NAME="DATABASE_NAME"
printenv
実際のソースコマンドが機能することをテストするためにのみ、コマンドを追加しました。sourceコマンドが正常に機能することを確認するか、Dockerログに環境変数が表示される場合は、おそらく削除する必要があります。
--env-file
、docker run
コマンドに引数を指定するオプションがない場合です。たとえば、Googleアプリエンジンを使用してアプリケーションをデプロイしていて、コンテナー内で実行されているアプリにDockerコンテナー内で設定された環境変数が必要な場合、docker run
コマンドを制御できないため、環境変数を設定する直接的な方法はありません。。このような場合、たとえばKMSを使用してenv変数を復号化し、それらをenv.sh
env変数を設定するために取得できるに追加するスクリプトを作成できます。
.
、通常のPOSIX (ドット)コマンドを使用できます。(と同じ)sh
source
source
.
jqを使用してenvをJSONに変換します。
env_as_json=`jq -c -n env`
docker run -e HOST_ENV="$env_as_json" <image>
これにはjqバージョン1.6以降が必要です
これは、ホストenvをjsonとして貼り付けます。Dockerfileの場合と同様です。
ENV HOST_ENV (all env from the host as json)
docker run -e HOST_ENV="$env_as_json" <image>
?:?私の場合、Dockerは、Docker 引数として渡されたときに変数またはサブシェル(${}
または$()
)を解決していないようです。例:A=123 docker run --rm -it -e HE="$A" ubuntu
次に、そのコンテナの内部:root@947c89c79397:/# echo $HE root@947c89c79397:/#
... HE
変数はそれを作成しません。
-eフラグと$を使用して、マシン環境変数をホストすることもできます。
docker run -it -e MG_HOST=$MG_HOST -e MG_USER=$MG_USER -e MG_PASS=$MG_PASS -e MG_AUTH=$MG_AUTH -e MG_DB=$MG_DB -t image_tag_name_and_version
この方法を使用することにより、私の場合、指定した名前で環境変数を自動的に設定します(MG_HOST、MG_USER)
Pythonを使用している場合は、Docker内でこれらの環境変数にアクセスできます。
import os
host,username,password,auth,database=os.environ.get('MG_HOST'),os.environ.get('MG_USER'),os.environ.get('MG_PASS'),os.environ.get('MG_AUTH'),os.environ.get('MG_DB')
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
内に保存されているデータをgrep .env
してDockerに渡す方法です。安全に保存されているものは何もありません(そのため、単にdocker history
キーを見て取得することはできません)。
あなたの.env
ようにたくさんのAWSのものを持っているとしましょう:
AWS_ACCESS_KEY: xxxxxxx
AWS_SECRET: xxxxxx
AWS_REGION: xxxxxx
`` `docker run --rm -it --env-file <(bash -c 'env | grep AWS_')でdockerを実行すると、すべてが取得され、コンテナー内からアクセスできるように安全に渡されます。