web-dev-qa-db-ja.com

docker composeで環境変数を使用する方法

Docker-compose.ymlの中で、docker-composeの起動時に渡された値でenv変数を使用できるようにしたいと思います。これがその例です。私は今日、これを基本のdocker runコマンドで実行しています。そのようなbashラッパーなしで、composeでそれを達成する方法はありますか?

proxy:
  hostname: $hostname
  volumes:
    - /mnt/data/logs/$hostname:/logs
    - /mnt/data/$hostname:/data
151
Dmitry z
  1. template.ymlを作成します。これはあなたのdocker-compose.ymlと環境変数です。
  2. あなたの環境変数が 'env.sh'ファイルにあるとします。
  3. 以下のコードをshファイルに入れて実行します。

ソースenv.sh。 rm -rf docker-compose.yml; envsubst <"template.yml"> "docker-compose.yml";

新しいファイルdocker-compose.ymlは、正しい環境変数の値で生成されます。

Template.ymlファイルのサンプル:

oracledb:
        image: ${Oracle_DB_IMAGE}
        privileged: true
        cpuset: "0"
        ports:
                - "${Oracle_DB_PORT}:${Oracle_DB_PORT}"
        command: /bin/sh -c "chmod 777 /tmp/start; /tmp/start"
        container_name: ${Oracle_DB_CONTAINER_NAME}

Env.shファイルの例:

#!/bin/bash 
export Oracle_DB_IMAGE=<image-name> 
export Oracle_DB_PORT=<port to be exposed> 
export Oracle_DB_CONTAINER_NAME=Oracle_DB_SERVER
72
Saurabh Kumar

ドッカーソリューション:

Docker-compose 1.5以降で変数置換が有効になっているようです。 https://github.com/docker/compose/releases

最新のDocker Composeでは、作成ファイルから環境変数にアクセスできます。それで、あなたはあなたの環境変数を供給することができますそしてそうComposeを実行するように:

set -a
source .my-env
docker-compose up -d

そうすると、docker-compose.ymlの中の$ {VARIABLE}を使って変数を参照できます。

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}などの拡張シェルスタイルの機能はサポートされていません。

構成値にリテラルドル記号を入れる必要がある場合は、二重ドル記号($$)を使用してください。

そして、私はこの機能がこのpull requestに追加されたと思います。 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)を使用して、作成ファイル内のenv変数を参照するだけです。

COMPOSE_CONFIGは私の.envファイルで定義されており、私のbashスクリプトで使用されていますが、bashスクリプトの{$COMPOSE_CONFIG}my-compose-file.ymlに簡単に置き換えることができます。

また、この展開には、すべてのコンテナーに "myproject"という接頭辞を付けて命名しています。好きな名前を付けることができますが、後で簡単に参照できるようにコンテナを識別するのに役立ちます。あなたのコンテナが本来あるべき状態でステートレスであると仮定すると、このスクリプトはあなたの.envファイルのparamsとあなたの作成するYAMLファイルに従ってあなたのコンテナを素早く削除して再デプロイします。

更新この回答はかなり人気があるように思われるので、私は自分のDocker展開ワークフローをより詳しく説明したブログ記事を書きました。 http:// lukeswart。 net/2016/03/lets-deploy-part-1 / これは、nginx構成、LetsEncrypt証明書、およびリンクされたコンテナなど、配備構成をより複雑にする場合に役立ちます。

197
modulitos

Docker-composeがファイル内の デフォルトの環境変数をネイティブにサポートしているようです

あなたがする必要があるのは.envという名前のファイルであなたの変数を宣言することであり、それらはdocker-compose.ymlで利用可能になるでしょう。

たとえば、内容が.envファイルの場合:

MY_SECRET_KEY=SOME_SECRET
IMAGE_NAME=docker_image

あなたはdocker-compose.ymlの中であなたの変数にアクセスするか、またはそれらをコンテナに転送することができます:

my-service:
  image: ${IMAGE_NAME}
  environment:
    MY_SECRET_KEY: ${MY_SECRET_KEY}
54
Doody P

ボリュームに環境変数を使用する場合は、次のものが必要です。

  1. docker-compose.yamlファイルと同じフォルダに .env ファイルを作成します。

  2. .envファイルで変数を宣言します。

    HOSTNAME=your_hostname
    
  3. $hostnameファイルで${HOSTNAME}docker-compose.yamlに変更します

    proxy:
      hostname: ${HOSTNAME}
      volumes:
        - /mnt/data/logs/${HOSTNAME}:/logs
        - /mnt/data/${HOSTNAME}:/data
    

もちろん、ビルドごとに動的にこれを行うことができます。

echo "HOSTNAME=your_hostname" > .env && Sudo docker-compose up
15

最善の方法は、docker-compose.ymlファイルの外側で環境変数を指定することです。 env_file設定を使用して、環境ファイルを同じ行に定義することができます。その後、docker-compose upをもう一度実行すると、新しい環境変数でコンテナが再作成されます。

これが私のdocker-compose.ymlの様子です:

services:
  web:
    env_file: variables.env

注意:docker-composeは、envファイルの各行がVAR=VAL形式であることを想定しています。 .envファイル内でexportを使用しないでください。また、.envファイルは、docker-composeコマンドが実行されるフォルダに配置する必要があります。

9
Jibu James

以下はdocker-compose 3.xに適用されます。コンテナ内の環境変数の設定

method - 1ストレートメソッド

web:
  environment:
    - DEBUG=1
      POSTGRES_PASSWORD: 'postgres'
      POSTGRES_USER: 'postgres'

method - 2“ .env”ファイル

Docker-compose.ymlと同じ場所に.envファイルを作成します。

$ cat .env
TAG=v1.5
POSTGRES_PASSWORD: 'postgres'

そしてあなたの作成ファイルは次のようになります。

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"
    postgres_password: "${POSTGRES_PASSWORD}"

ソース

8
Gajendra D Ambi

まだできません…。しかしこれは代替手段です。docker-composer.ymlジェネレータのように考えてください:

https://Gist.github.com/Vad1mo/9ab63f28239515d4dafd

基本的にあなたの変数を置き換えるシェルスクリプト。また、Gruntタスクを使用して、CIプロセスの最後にdocker composeファイルを構築することもできます。

5
Thomas Decaux

私はこれのために私が作成した単純なbashスクリプトを持っていますそれはあなたのファイルでそれを使う前にそれを実行することを意味します: https://github.com/antonosmond/subber

基本的には、環境変数を表すために二重の中括弧を使って作成ファイルを作成するだけです。例えば:

app:
    build: "{{APP_PATH}}"
ports:
    - "{{APP_PORT_MAP}}"

二重の中括弧で囲まれたものはすべて、同じ名前の環境変数に置き換えられます。そのため、次の環境変数を設定したとします。

APP_PATH=~/my_app/build
APP_PORT_MAP=5000:5000

subber docker-compose.ymlを実行すると、結果のファイルは次のようになります。

app:
    build: "~/my_app/build"
ports:
    - "5000:5000"
3
Anton

私の知る限りでは、これは進行中の作業です。彼らはそれをしたいのですが、まだリリースされていません。 @Andyによって言及された 1377 (「新しい」 495 を参照) ).

@Thomasが提案したように、 "CIの一部として.ymlを生成する"というアプローチを実装しました。

1
anroots

Docker-compse.ymlで動的な値を定義するには.envファイルを使います。 portかそれ以外の値か。

サンプルdocker-compose:

testcore.web:
       image: xxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/testcore:latest
       volumes: 
            - c:/logs:c:/logs
       ports:
            - ${TEST_CORE_PORT}:80
       environment:
            - CONSUL_URL=http://${CONSUL_IP}:8500 
            - Host=${Host_ADDRESS}:${TEST_CORE_PORT}

.envファイル内で、これらの変数の値を定義できます。

CONSUL_IP=172.31.28.151
Host_ADDRESS=172.31.16.221
TEST_CORE_PORT=10002
0
sorabzone

.envファイルにenvを追加する

といった

VERSION=1.0.0

それをdeploy.shに保存します

INPUTFILE=docker-compose.yml
RESULT_NAME=docker-compose.product.yml
NAME=test

prepare() {
        local inFile=$(pwd)/$INPUTFILE
        local outFile=$(pwd)/$RESULT_NAME
        cp $inFile $outFile
        while read -r line; do
            OLD_IFS="$IFS"
            IFS="="
            pair=($line)
            IFS="$OLD_IFS"
               sed -i -e "s/\${${pair[0]}}/${pair[1]}/g" $outFile
            done <.env
     }

deploy() {
        docker stack deploy -c $outFile $NAME
}


prepare
deploy
0
foxundermon