带有Sidecar的Windows容器,用于数据

时间:2018-02-15 22:10:06

标签: docker docker-volume windows-container

我正在尝试将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来创建广告驱动器,这是没有意义,因为放在那里的任何东西都不会出现在最终的容器中?

1 个答案:

答案 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"