Docker-compose.ymlの中で、docker-composeの起動時に渡された値でenv変数を使用できるようにしたいと思います。これがその例です。私は今日、これを基本のdocker runコマンドで実行しています。そのようなbashラッパーなしで、composeでそれを達成する方法はありますか?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
template.yml
を作成します。これはあなたのdocker-compose.yml
と環境変数です。ソース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
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
私は人々が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証明書、およびリンクされたコンテナなど、配備構成をより複雑にする場合に役立ちます。
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}
ボリュームに環境変数を使用する場合は、次のものが必要です。
docker-compose.yaml
ファイルと同じフォルダに .env ファイルを作成します。
.env
ファイルで変数を宣言します。
HOSTNAME=your_hostname
$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
最善の方法は、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コマンドが実行されるフォルダに配置する必要があります。
以下は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}"
まだできません…。しかしこれは代替手段です。docker-composer.ymlジェネレータのように考えてください:
https://Gist.github.com/Vad1mo/9ab63f28239515d4dafd
基本的にあなたの変数を置き換えるシェルスクリプト。また、Gruntタスクを使用して、CIプロセスの最後にdocker composeファイルを構築することもできます。
私はこれのために私が作成した単純な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"
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
といった
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