Dockerは初めてですが、コンテナーから外部データベースにアクセスする方法は不明です。接続文字列をハードコードするための最善の方法はありますか?
# Dockerfile
ENV DATABASE_URL Amazon:rds/connection?string
-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形式であることを期待します。コメント行の先頭には#を付けるだけです。
コンテナをスピンアップする方法として '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"
これにより、コンテナ内の任意のファイルにデータベース接続文字列をハードコーディングしなくても済むようになります。
環境変数を設定するには-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/ /
docker-compose
を使って、docker-compose.ymlとdocker-compose
によって呼び出されたDockerfileの両方の中でShell env変数を継承して画像を構築する方法を示します。 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
ホストマシンの環境変数をdockerコンテナーにパイプする方法があります。
env > env_file && docker run --env-file env_file image_name
env > env_file
は _ all _ Host machineのENV変数をenv_file
にダンプし、実行中のコンテナでアクセスできるようにするため、このテクニックは非常に慎重に使用してください。
Amazon AWS ECS/ECRの場合は、プライベートS3バケットを介して環境変数( 特に秘密 )を管理する必要があります。ブログ記事を参照してくださいAmazon S3およびDockerを使用してAmazon EC2 Container Serviceベースのアプリケーションの秘密を管理する方法.
別の方法は/usr/bin/env
の力を使うことです:
docker run ubuntu env DEBUG=1 path/to/script.sh
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ログに表示されることを確認したら、おそらく削除する必要があります。
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)