首页 > 解决方案 > Docker secret 挂载一个空字符串

问题描述

我有一个 docker 服务(在 swarm 内),它使用两个秘密作为环境变量(证书的签名证书和密码)

秘密是使用以下命令创建的:

docker secret create signing-certificate signing-certificate.pfx

echo "mypassword" | docker secret create signing-certificate-password -

docker-compose.yml:

version: '3.7'

secrets:
    signing-certificate:
        external: true
    signing-certificate-password:
        external: true

services:
  login:
    image: registry.mydomain.com/login:latest
    secrets:
      - signing-certificate
      - signing-certificate-password
    environment:
        - KeyFilePath=/run/secrets/signing-certificate
        - KeyFilePassword=/run/secrets/signing-certificate-password

在 (.netcore-) 服务中,我使用以下代码检索变量:

    var certPassword = Environment.GetEnvironmentVariable("KeyFilePassword");
    var certPath = Environment.GetEnvironmentVariable("KeyFilePath");

证书本身工作得很好,并且存在于服务中。问题是密码:它是一个空字符串。

如果我将 docker-compose 更改为此它可以正常工作:

environment:
    - KeyFilePath=/run/secrets/signing-certificate
    - KeyFilePassword=mypassword

所以我怀疑安装飞机文本秘密有些奇怪。

我还尝试了这些命令来创建秘密:

echo mypassword | docker secret create signing-certificate-password -
echo 'mypassword | docker secret create signing-certificate-password -
printf mypassword | docker secret create signing-certificate-password -

知道我在做什么错吗?或者它可能是一个错误?

Docker-Version: 19.03.8 
Kernel Version: 4.15.0-96-generic Operating
System: Ubuntu 18.04.4 LTS

标签: dockerdocker-composeasp.net-core-3.1docker-secrets

解决方案


如何Environment.GetEnvironmentVariable处理换行符?使用echo\n在您的密码末尾添加一个,这会混淆某些系统。

cat /run/secrets/signing-certificate-password您可以通过运行并查看输出和提示符之间是否有换行符来确认这一点。

如果这是问题,使用echo -n ..应该可以解决它。


推荐阅读