Windows 带有 Sidecar 的数据容器

Windows Container with Sidecar for data

我正在尝试将 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 文档说明如下:

Volumes on Windows-based containers: When using Windows-based containers, the destination of a volume inside the container must be one of:

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:

而且这个容器居然正常启动了。但是,我在文档中错过了:

Changing the volume from within the Dockerfile: If any build steps change the data within the volume after it has been declared, those changes will be discarded.

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

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

很遗憾,您不能以这种方式使用 Windows 容器卷。此限制也是使用数据库容器(如 microsoft/mssql-server-windows-developer)真正痛苦的原因。您无法在 non-empty 数据库文件夹上创建卷,因此您无法在容器 re-creation.

之后恢复数据库

至于您的用例,我建议您使用反向代理(例如 Nginx)。 您创建另一个容器,其中包含 Nginx 服务器和证书。然后让它处理所有传入的 HTTPS 请求,终止 SSL/TLS,然后使用纯 HTTP 协议将请求传递给内部应用程序容器。 通过这样的部署,您不必将 HTTPS 证书复制并安装到所有应用程序容器。只有一个地方可以存储证书,您可以通过使用不同的 Nginx 镜像版本(或使用卷绑定证书文件夹)来更改 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"