我正在尝试设置一个windows nanoserver容器,作为一个侧容器,其中包含我用于SSL的证书。因为我需要的SSL证书在每个环境中都有变化,所以我需要能够在启动时更改sidecar容器(即dev-cert容器、prod容器等)。我已经解决了配置问题,但在使用与Linux容器相同的模式时遇到了困难。
在linux容器上,我只需将文件复制到容器中,并使用卷步骤导出卷。然后,在我的主应用程序容器上,我可以使用volumes_from从sidecar导入卷。
我试着用纳米服务器遵循同样的模式,却无法工作。这是我的文档:
# Building stage
FROM microsoft/nanoserver
RUN mkdir c:\\certs
COPY . .
VOLUME c:/certs容器构建得很好,但是当我尝试运行它时,我会得到以下错误。dockerfile文档说明如下:
基于Windows的容器上的卷:当使用基于Windows的容器时,容器内卷的目的地必须是: 一个不存在或空的目录,它是C以外的驱动器:
所以我想,很简单,我只需要切换到D驱动器(因为我不想像#1所需的那样导出一个空目录)。我做了以下修改:
# Building stage
FROM microsoft/windowservercore as build
VOLUME ["d:"]
WORKDIR c:/certs
COPY . .
RUN copy c:\certs d:这个容器实际上是正常启动的。然而,我错过了医生说的话:
从Dockerfile中更改卷:如果任何构建步骤在声明卷后更改卷内的数据,则这些更改将被丢弃。
因此,当我检查时,d:\certs目录中没有任何文件。
那么,如果,#1目录必须是空的才能在容器中的c驱动器上生成卷,并且必须使用卷来创建d驱动器,那么如何在windows容器中挂载用于外部使用的驱动器,这是没有意义的,因为放在其中的任何内容都不会在最终容器中?
发布于 2018-03-08 02:13:04
不幸的是,您不能以这种方式使用Windows容器卷。而且,这也是为什么使用数据库容器(如microsoft/mssql-server-windows-developer)是一个真正痛苦的原因。不能在非空数据库文件夹上创建卷,因此在容器重新创建后无法还原数据库。
至于您的用例,我建议您使用反向代理(例如,Nginx )。您可以使用Nginx服务器和内部的证书创建另一个容器。然后让它处理所有传入的HTTPS请求,终止SSL/TLS,然后使用普通HTTP协议将请求传递给内部应用程序容器。通过这样的部署,您不必将HTTPS证书复制并安装到所有应用程序容器中。只有一个地方可以存储证书,只需使用不同的Nginx映像版本(或使用卷绑定证书文件夹)就可以更改dev/test/etc证书。
更新:
此外,如果您仍然想使用侧加容器,您可以尝试一个小黑客。所以基本上你要移动这个操作
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"https://stackoverflow.com/questions/48817130
复制相似问题