docker compose 3.1(swarm),secrets,ssl和nginx

时间:2017-04-13 20:15:47

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

我在docker容器中运行了一个nginx。在服务器块内的nginx conf文件中,我已经输入了ssl配置 - 端口,crt和密钥。 nginx查找crt和密钥文件的最简单方法是,我为2个文件创建一个docker机密,并在生成服务时将其安装在/ run / secrets /。但是,我希望在docker镜像中有crt和key文件,这可能就像nginx可以使用的开箱文件一样,如果客户创建了一个秘密,并插入了crt和密钥文件,我希望nginx能够使用那些

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

我该如何解决这个问题?

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

1 个答案:

答案 0 :(得分:0)

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

您的脚本看起来像(给定阿尔卑斯山图像):

#!/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覆盖它们。