glen / docker-secrets-provider

Pimple Docker Secrets ServiceProvider

1.1.0 2018-04-10 12:19 UTC

This package is auto-updated.

Last update: 2024-08-29 04:54:15 UTC


README

DockerSecretsProvider 是一个用于管理敏感数据(例如使用 Docker secrets)的 Pimple ServiceProvider,对于基于 Silex 的应用程序非常有用。

Docker 1.13 在集群模式下提供了秘密。

您可以使用秘密来管理在运行时需要但不想存储在镜像或源控制中的任何敏感数据,例如:

  • 用户名和密码
  • TLS 证书和密钥
  • SSH 密钥
  • 其他重要数据,例如数据库或内部服务器的名称
  • 通用字符串或二进制内容(大小最多为 500 kb)

使用方法

使用 docker CLI 创建秘密

echo -n "This is a secret" | docker secret create my_secret_data -

注意 echo 中的 -n 参数;这是为了抑制尾随换行符。如果您不这样做,您的值可能无法正确编码。

将其挂载到容器中,此示例适用于 docker-composedocker stack deploy

version: "3.1"

services:
  app:
  ...
    secrets:
      - my_secret_data
...
secrets:
  my_secret_data:
    external: true

在开发模式下,您可以使用 file: 指令使用秘密而不使用集群

secrets:
  my_secret_data:
    # for local development, use from local file
    file: my_secret_data.secret

需要库

composer require glen/docker-secrets-provider

在 Pimple 容器中映射秘密

$app->register(new DockerSecretsProvider(array(
   'my_secret_data' => 'my.secret',
)));

这将使 $app['my.secret'] 读作 "This is a secret"

在嵌套结构的情况下($app['option']['key']),值可以是回调,以允许将值分配给子键。

以下是一个使用 saxulum/saxulum-doctrine-mongodb-odm-provider 的示例

$this->register(new DockerSecretsProvider(array(
    'mongodb' => function ($secretReader, $app) {
        // make copy for later assignment,
        $options = $app['mongodb.options'];

        // make as function to avoid loading secret to memory before it's use is needed
        $app['mongodb.options'] = function () use ($secretReader, $options, $app) {
            $options['options']['password'] = $secretReader();

            return $options;
        };
    },
)));

为了避免 间接修改重载元素,需要复制值并将其重新分配

// yields "Indirect modification of overloaded element" notice:
$app['mongodb.options']['options']['password'] = 'secret';

// workaround for above problem:
$options = $app['mongodb.options'];
$options['options']['password'] = 'secret';
$app['mongodb.options'] = $options;