「docker service create」でdocker/swarmシークレット値を環境変数として使用するにはどうすればよいですか?

「docker service create」でdocker/swarmシークレット値を環境変数として使用するにはどうすればよいですか?

docker swarm クラスター上にサービスを作成するスクリプトを作成する必要があります。サンプル スクリプトは次のようになります。

docker service create \
    --name postgres \
    --mode global \
    --constraint "node.labels.postgres==master" \
    --network my-network \
    --env POSTGRES_USER="postgres" \
    --env POSTGRES_PASSWORD="****" \
    postgres:10

POSTGRES_USER および POSTGRES_PASSWORD 環境変数は、Docker シークレットから取得する必要があります。例:

echo "example_password" | docker secret create postgres-password -

実行中のコンテナ内からファイルとしてシークレットにアクセスできることは理解しています。ただし、上記の例では、シークレットを環境変数として「service create」コマンドに渡す必要があります。シークレットはコンテナのエントリ ポイントで使用されるため、コンテナが作成される前に提示する必要があります。では、「docker service create」コマンドの --env スイッチにシークレットを渡すにはどうすればよいのでしょうか。

答え1

ここで述べたようにhttps://github.com/docker-library/docs/blob/master/postgres/README.md次のように _FILE サフィックスを追加すると、Postgres サービスで Swarm Secret を使用できます。

docker service create \
    --name postgres \
    --mode global \
    --constraint "node.labels.postgres==master" \
    --network my-network \
    --secret "postgres-password" \
    --env POSTGRES_USER="postgres" \
    --env POSTGRES_PASSWORD_FILE="/run/secrets/postgres-password" \
    postgres:10 

あらゆるサービスに共通するソリューションについて質問すると、パスワードをクリアテキストで公開するコンテナまたはサービスを作成しなければ不可能です(たとえば、秘密のファイルからパスワードを読み取る Nginx など)。

関連情報