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 など)。