web-dev-qa-db-ja.com

Dockerコンテナーに環境変数を渡すにはどうすればいいですか?

Dockerは初めてですが、コンテナーから外部データベースにアクセスする方法は不明です。接続文字列をハードコードするための最善の方法はありますか?

# Dockerfile
ENV DATABASE_URL Amazon:rds/connection?string
599
AJcodez

-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ファイルを使うことができます

$ docker run --env-file ./env.list ubuntu bash

--env-fileフラグはファイル名を引数として取り、各行が--envに渡される引数を真似たVAR = VAL形式であることを期待します。コメント行の先頭には#を付けるだけです。

921
errata

here および@errataで述べられているように、-eコマンドでdocker run ..パラメータを使用して渡すことができます。
ただし、この方法では、資格情報が実行されるプロセスの一覧に表示されることがあります。
より安全にするために、あなたはあなたの証明書を設定ファイルに書き、 here のようにdocker runを付けて--env-fileをすることができます。そうすれば、その設定ファイルのアクセスを制御して、そのマシンにアクセスできる他の人があなたの資格を見ることができないようにすることができます。

82
Sabin

コンテナをスピンアップする方法として '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"

これにより、コンテナ内の任意のファイルにデータベース接続文字列をハードコーディングしなくても済むようになります。

42
Marquistador

環境変数を設定するには-eまたは--env値を使用します(デフォルト[])。

起動スクリプトの例:

 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/ /

19
Vishnu Mishra

docker-composeを使って、docker-compose.ymlとdocker-composeによって呼び出されたDockerfileの両方の中でShell env変数を継承して画像を構築する方法を示します。 DockerfileRUNコマンドで、環境に固有のコマンドを実行する必要があると言った場合、これが役に立つことがわかりました。

(あなたのシェルはすでに環境に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-composebuild/upコマンドで環境変数を指定する必要がなくなります。

docker-compose build
docker-compose up
17
joshweir

ホストマシンの環境変数をdockerコンテナーにパイプする方法があります。

env > env_file && docker run --env-file env_file image_name

env > env_file _ all _ Host machineのENV変数をenv_fileにダンプし、実行中のコンテナでアクセスできるようにするため、このテクニックは非常に慎重に使用してください。

6
Alex T

Amazon AWS ECS/ECRの場合は、プライベートS3バケットを介して環境変数( 特に秘密 )を管理する必要があります。ブログ記事を参照してくださいAmazon S3およびDockerを使用してAmazon EC2 Container Serviceベースのアプリケーションの秘密を管理する方法.

4
Joseph Juhnke

別の方法は/usr/bin/envの力を使うことです:

docker run ubuntu env DEBUG=1 path/to/script.sh
4
sanmai

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ログに表示されることを確認したら、おそらく削除する必要があります。

2
akilesh raj

Jqを使ってenvをJSONに変換する:

env_as_json=`jq -c -n env`
docker run -e Host_ENV="$env_as_json" <image>

これにはjqバージョン 1.6 またはそれ以降が必要です

これはHost envをjsonとしてプッシュします。Dockerfileの場合と基本的に同じです。

ENV Host_ENV  (all env from the Host as json)
0
Alexander Mills