3

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

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

我尝试使用 nanoserver 遵循相同的模式,但无法正常工作。这是我的码头文件:

# 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:

这个容器实际上是正确启动的。但是,我在文档中错过了 is 说:

从 Dockerfile 中更改卷:如果任何构建步骤在声明卷后更改了卷中的数据,则这些更改将被丢弃。

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

那么如何在windows容器中挂载一个驱动器供外部使用,#1目录必须为空才能在容器中的c驱动器上创建一个VOLUME,并且使用必须使用VOLUME来创建广告驱动器,这是没有意义的,因为任何东西放在那里会不会是在最后的容器里?

4

1 回答 1

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"
于 2018-03-08T02:13:04.050 回答