我正在尝试将windows nanoserver容器设置为包含我用于SSL的证书的sidecar容器。因为我需要在每个环境中更改SSL证书,所以我需要能够在启动时更改sidecar容器(即dev-cert容器,prod-cert容器等)。我已经解决了配置问题,但是使用与Linux容器相同的模式时遇到了问题。
在linux容器上,我只需将文件复制到容器中,然后使用VOLUMES步骤导出我的卷。然后,在我的主应用程序容器上,我可以使用volumes_from从sidecar导入卷。
我试图用纳米服务器遵循相同的模式,但无法正常工作。这是我的dockerfile:
# Building stage
FROM microsoft/nanoserver
RUN mkdir c:\\certs
COPY . .
VOLUME c:/certs
容器构建得很好,但是当我尝试运行它时出现以下错误。 dockerfile文档说明如下:
基于Windows的容器上的卷:使用基于Windows的容器时 容器,容器内容量的目标必须是 其中之一:
a non-existing or empty directory a drive other than 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驱动器上创建VOLUME,那么如何在Windows容器中安装驱动器以供外部使用,并且必须使用VOLUME来创建广告驱动器,这是没有意义,因为放在那里的任何东西都不会出现在最终的容器中?
答案 0 :(得分:2)
很遗憾,您无法以这种方式使用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"