我正在尝试将Windows nanoserver容器设置为Sidecar容器,其中包含用于SSL的证书。因为我需要在每个环境中更改的SSL证书,所以我需要能够在启动时更改sidecar容器(即dev-cert容器,prod-cert容器等)。我已经解决了配置问题,但是在使用与Linux容器相同的模式时遇到了麻烦。

在linux容器上,我只需将文件复制到容器中,然后使用VOLUMES步骤导出我的卷。然后,在主应用程序容器上,我可以使用volumes_from从sidecar导入卷。

我试图用nanoserver遵循相同的模式,但无法正常工作。这是我的dockerfile:

# Building stage
FROM microsoft/nanoserver

RUN mkdir c:\\certs
COPY . .

VOLUME c:/certs

容器构建的很好,但是当我尝试运行它时出现以下错误。 dockerfile文档说明以下内容:



所以我想,很容易,我将直接切换到D驱动器(因为我不想像#1那样导出一个空目录)。我进行了以下更改:
# Building stage
FROM microsoft/windowservercore as build
VOLUME ["d:"]

WORKDIR c:/certs
COPY . .

RUN copy c:\certs d:

并且该容器实际上正常启动。但是,我错过了在文档中说的地方:



因此,当我检查时,d:\ certs目录中没有任何文件。

因此,如果#1目录必须为空以在容器中的C驱动器上创建VOLUME,并且必须使用VOLUME来创建广告驱动器,那么如何在Windows容器中安装供外部使用的驱动器,这毫无意义,因为放在最终的容器中会不会有?

最佳答案

不幸的是,您不能以这种方式使用Windows容器卷。同样,此限制也是使用数据库容器(例如microsoft / mssql-server-windows-developer)真正痛苦的原因。您不能在非空数据库文件夹上创建卷,因此,无法在重新创建容器后还原数据库。

至于您的用例,我建议您使用反向代理(例如Nginx)。
您使用Nginx服务器和内部证书创建另一个容器。然后,让它处理所有传入的HTTPS请求,终止SSL / TLS,然后使用纯HTTP协议(protocol)将请求传递到内部应用程序容器。
通过这种部署,您不必将HTTPS证书复制并安装到所有应用程序容器。只有一个地方存储证书,您可以仅使用不同的Nginx镜像版本(或通过使用volume绑定(bind)证书文件夹)来更改dev / test / etc证书。

更新:

另外,如果您仍想使用Sidecar容器,则可以尝试一个小技巧。所以基本上您将移动此操作

COPY . .

从构建时间到运行时(容器启动后)。
像这样:
FROM microsoft/nanoserver

RUN mkdir c:\\certs_in
RUN mkdir c:\\certs_out

VOLUME c:/certs_out
CMD copy "C:\certs_in" *.*  "D:\certs_out"

10-06 13:52
查看更多