DOCKERソリューション:
docker-compose 1.5+で変数置換が有効になっているようです:https : //github.com/docker/compose/releases
最新のDocker Composeでは、構成ファイルから環境変数にアクセスできます。したがって、環境変数を取得してから、次のようにComposeを実行できます。
set -a
source .my-env
docker-compose up -d
次に、次のように$ {VARIABLE}を使用してdocker-compose.ymlの変数を参照できます。
db:
image: "postgres:${POSTGRES_VERSION}"
そして、ここにここから取られたドキュメントの詳細情報があります:https : //docs.docker.com/compose/compose-file/#variable-substitution
この設定でdocker-compose upを実行すると、ComposeはシェルでPOSTGRES_VERSION環境変数を探し、その値を代入します。この例では、Composeは設定を実行する前にイメージをpostgres:9.3に解決します。
環境変数が設定されていない場合、Composeは空の文字列に置き換えます。上記の例では、POSTGRES_VERSIONが設定されていない場合、imageオプションの値はpostgres:です。
$ VARIABLE構文と$ {VARIABLE}構文の両方がサポートされています。$ {VARIABLE-default}や$ {VARIABLE / foo / bar}などの拡張シェルスタイルの機能はサポートされていません。
構成値にリテラルドル記号を配置する必要がある場合は、二重ドル記号($$)を使用します。
そして、私はこの機能がこのプルリクエストに追加されたと思います:https : //github.com/docker/compose/pull/1765
BASHソリューション:
Dockerの環境変数のサポートに問題があることに気づきました。Dockerで環境変数を扱う代わりに、bashなどの基本に戻りましょう!以下は、bashスクリプトと.env
ファイルを使用したより柔軟な方法です。
.envファイルの例:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
次に、同じbashスクリプトを同じディレクトリで実行します。これにより、すべてが適切に展開されます。
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
通常のbash構文(つまり、ファイルから${SECRET_KEY}
を挿入する)を使用して、構成ファイル内の環境変数を参照するだけです。SECRET_KEY
.env
なお、COMPOSE_CONFIG
私の中で定義され.env
たファイルと私のbashスクリプトで使用されるが、あなただけで簡単に交換することができ{$COMPOSE_CONFIG}
てmy-compose-file.yml
bashスクリプトで。
また、すべてのコンテナに「myproject」という接頭辞を付けて、このデプロイメントにラベルを付けたことにも注意してください。任意の名前を使用できますが、後で簡単に参照できるようにコンテナーを識別するのに役立ちます。コンテナーがステートレスであると想定すると、このスクリプトは、.envファイルのパラメーターと構成YAMLファイルに従って、コンテナーをすばやく削除して再デプロイします。
更新
この回答はかなり人気があるようですので、私のDockerデプロイメントワークフローをより深く説明するブログ投稿を書きました:http : //lukeswart.net/2016/03/lets-deploy-part-1/これは、 nginx configs、LetsEncrypt証明書、リンクされたコンテナなど、デプロイメント構成がより複雑になります。