1. ホーム
  2. docker

[解決済み] docker-compose v3.1でsecret値をどのように管理するのですか?

2022-03-07 19:19:10

質問

docker-compose.yml仕様のバージョン3.1では、以下のサポートが導入されています。 秘密 .

こんなことをやってみました。

version: '3.1'

services:
  a: 
    image: tutum/hello-world
  secret: 
    password: the_password
  b:
    image: tutum/hello-world

$ docker-compose up を返します。

Unsupported config option for services.secret: 'password'

シークレット機能は、実際にどのように使えばいいのでしょうか?

どのように解決するのですか?

を読むことができます。 公式ドキュメントの該当箇所 .

secretを使用するには、以下の2点を docker-compose.yml ファイルを作成します。まず、トップレベルの secrets: ブロックがあり、すべてのシークレットを定義しています。次に、別の secrets: ブロックは、各サービスの下にある どの の秘密は、サービスが受け取るべきものです。

例として、Dockerが理解できる2種類のsecretを作成します。 外部 の秘密と ファイル の秘密です。

1. を使用して「外部」シークレットを作成します。 docker secret create

まず最初に、Dockerでsecretを使用するには、あなたのいるノードがswarmの一部である必要があります。

$ docker swarm init

次に、「外部」シークレットを作成します。

$ echo "This is an external secret" | docker secret create my_external_secret -

(最後のダッシュを必ず入れてください。 - . 見逃しがちです)

2. 別の秘密をファイルに書き込む

$ echo "This is a file secret." > my_file_secret.txt

3. を作成します。 docker-compose.yml ファイルでは、両方のシークレットを使用します。

両方のタイプのシークレットが作成されたので、以下は docker-compose.yml このファイルは、その両方を読み込み、それらを web サービスを提供します。

version: '3.1'

services:
  web:
    image: nginxdemos/hello
    secrets:                    # secrets block only for 'web' service
     - my_external_secret
     - my_file_secret

secrets:                        # top level secrets block
  my_external_secret:
    external: true
  my_file_secret:
    file: my_file_secret.txt

Dockerは、自身のデータベースからsecretを読み込むことができます。 docker secret create ) またはファイルからです。上記は両方の例を示しています。

4. テストスタックをデプロイする

を使ってスタックをデプロイします。

$ docker stack deploy --compose-file=docker-compose.yml secret_test

これは、1つのインスタンスを作成します。 web という名前のサービスです。 secret_test_web .

5. サービスによって作成されたコンテナが、両方のシークレットを持つことを確認する

使用する docker exec -ti [container] /bin/sh を使用して、秘密が存在することを確認します。

(注)以下の docker exec コマンドでは m2jgac... の部分は、あなたのマシンでは異なるでしょう。実行 docker ps をクリックすると、コンテナ名が表示されます)。

$ docker exec -ti secret_test_web.1.m2jgacogzsiaqhgq1z0yrwekd /bin/sh

# Now inside secret_test_web; secrets are contained in /run/secrets/
root@secret_test_web:~$ cd /run/secrets/

root@secret_test_web:/run/secrets$ ls
my_external_secret  my_file_secret

root@secret_test_web:/run/secrets$ cat my_external_secret
This is an external secret

root@secret_test_web:/run/secrets$ cat my_file_secret
This is a file secret.

うまくいけば、手順 1 と 2 で作成した 2 つの secret が web コンテナは、スタックをデプロイしたときに作成されたものです。