0

我有一个在 docker 容器内运行的 nginx。在 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 个证书以在相同的情况下选择它们服务器块。有人对此也有任何想法吗?

4

1 回答 1

0

我认为对您来说最好的选择是为 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覆盖它们。

于 2017-05-28T13:01:47.150 回答