14

単一のコンテナー Docker イメージで遊んでいます。Composeを使用せずに、dbパスワードを秘密として保存したいと思います(今のところ、それとGradleに問題があります)。作成しなくてもシークレットを使用できると思っていましたが、試してみると...

$ echo "helloSecret" | docker secret create helloS -

デーモンからのエラー応答: このノードは swarm マネージャーではありません。「docker swarm init」または「docker swarm join」を使用してこのノードを swarm に接続し、再試行してください。

シークレットを使用するためだけに swarm モードを使用する必要があるのはなぜですか? クラスターがないと使用できないのはなぜですか?

4

2 に答える 2

10

docker がシークレットを実装する方法であるため、シークレットに対して swarm モードを実行する必要があります。シークレットの価値は、ワーカーがシークレットをディスクに書き込むことはなく、シークレットは知る必要があること (タスクがそこでスケジュールされるまで他のワーカーはシークレットを受信しない) であり、マネージャーがそのシークレットをディスク上で暗号化することです。マネージャーでのシークレットの保存には、raft データベースが使用されます。

コマンドを使用して、単一ノードの swarm クラスターを簡単にデプロイできますdocker swarm init。そこから、docker-compose upに変更されdocker stack deploy -c docker-compose.yml $stack_nameます。


swarm モードのシークレットと構成は、構成のために単一のファイル ボリュームをコンテナーにマウントするための代替手段を提供します。したがって、単一のノードで swarm モードがなくても、いつでも次の定義を行うことができます。

version: '2'
services:
  app:
    image: myapp:latest
    volumes:
    - ./secrets:/run/secrets:ro

または、これらのシークレットを名前付きボリュームにロードすることで、アプリからシークレットをわずかに分離できます。そのためには、次のようなことができます。

tar -cC ./secrets . | docker run -i -v secrets:/secrets busybox tar -xC /secrets

次に、その名前付きボリュームをマウントします。

version: '2'
volumes:
  secrets:
    external: true
services:
  app:
    image: myapp:latest
    volumes:
    - secrets:/run/secrets:ro
于 2019-01-31T13:54:20.210 に答える