【问题标题】:docker compose 3.1(swarm), secrets, ssl and nginxdocker compose 3.1(swarm)、secrets、ssl 和 nginx
【发布时间】:2017-04-13 20:15:47
【问题描述】:

我有一个 nginx 在 docker 容器中运行。在 server 块内的 nginx conf 文件中,我放入了 ssl 配置——端口、crt 和密钥。 nginx 查找 crt 和 key 文件的最简单方法是我为这两个文件创建一个 docker secret,并在服务生成时将其挂载到 /run/secrets/。但是,我希望在 docker 映像中有 crt 和 key 文件,它们可以像 nginx 可以使用的开箱即用文件一样,如果客户创建一个秘密,并插入 crt 和 key 文件,我希望 nginx 使用那些.

通过 3.1 compose file docs for secret,我意识到,要么秘密必须预先存在,要么必须作为 compose 文件的一部分创建。现在的挑战是,如果它必须预先存在,那么我将强制客户创建一个秘密(这意味着不仅要创建一个秘密,而且还要准备好 crt 和密钥文件作为 create secret 命令的输入)。如果我在撰写文件中创建它,我仍然需要访问客户必须提供的 crt 和密钥文件。这意味着,在任何一种情况下,这个东西都不能开箱即用。

我该如何解决这个问题?

如果有人读了这么多,仍然没有失去兴趣,即使上面得到了解决,我面临的另一个问题是在 nginx conf 中,我不能按优先级顺序指定 2 个证书来选择它们在同一个服务器块下。有人对此也有任何想法吗?

【问题讨论】:

    标签: docker-compose docker-swarm docker-secrets


    【解决方案1】:

    我认为对您来说最好的选择是为 NGINX 容器创建一个自定义入口点脚本,并结合环境变量和一个“模板”nginx.conf。这些将负责正确的证书配置。

    您的脚本将类似于(给定 Alpine 图像):

    #!/bin/sh
    
    if  [ -z $CERTS_FOLDER ]; then CERTS_FOLDER="/etc/nginx/default_crts/"; fi
    sed -i "s|{CERTS_FOLDER}|${CERTS_FOLDER}|g" /etc/nginx/nginx.conf
    
    nginx -g "daemon off;"
    

    你的 nginx.conf 中的匹配部分会是这样的:

    server {
        listen                  443 ssl;
        ssl                     on;
        server_name             my-server;
        ssl_certificate         {CERTS_FOLDER}my-server.crt;
        ...
    

    通过这种方式,您可以提供一些开箱即用的证书并使用compose environment variables 覆盖它们。

    【讨论】: