我目前有一个基于Docker compose的Web应用程序,该应用程序使用Nginx作为反向代理,将流量转发到Flask和Grafana docker实例。当前的任务是将诸如Jekyll之类的SSG(静态站点生成器)集成到设置中。

最直接的方法是:


具有一个Jekyll容器会持续运行并通过Nginx重定向(jekyll serve)服务站点的静态方面。

另一种方法是在Jekyll docker映像中运行build命令,并通过docker共享输出

还有另一种方法是在Nginx容器中生成站点。

前两种解决方案的缺点是它们创建了一个只能使用的Jekyll docker实例。一次,然后持续。在1.的情况下,服务可以由Nginx直接处理。在3.的情况下,Jekyll和Nginx之间没有分隔。这将很有用,因为Nginx还负责将流量路由到其他Docker实例。

问题是,有没有一种方法可以让Jekyll用Dockerfile填充Docker卷,从而可以由Nginx安装?逐步:



docker-compose build:构建站点并填充静态站点卷

docker-compose up -d:Nginx安装静态站点卷并为它服务

这种方法甚至有意义吗?

#1 楼

docker-compose只是docker周围的修饰包装,它为您提供了定期给docker builddocker run的所有选项的漂亮文字表示。另外,当然,它将多个docker映像/容器捆绑在一起。也就是说,除了调用docker之外,没有任何规定可以运行其他任何内容。

我看不到如何使用docker-compose build来填充卷。根据定义,卷不位于docker映像/容器内部,而位于(主机系统上)外部。 docker build从不写入主机系统,并且您无法在docker build期间装入卷。 docker-compose build基本上只为您运行docker build,也无法在主机上运行或编写任何内容。

因此,不,docker-compose build将无法创建静态文件。

您可以制作compose文件,以便它运行生成器(在docker容器内,写入命名卷),并在另一个容器中运行服务器(nginx或其他),并安装相同的命名卷(这将是我相信您的情况2)。然后,使用docker-compose up,将启动这两个容器。第一个将填充您的静态文件。第二个将服务。第一个会徘徊而后什么也不做,您可以忽略,但是这肯定是丑陋的。不幸的是,您无法使用docker-compose up --rm之类的东西来自动创建不必要的jekyll容器。

因此,最好的选择是自己启动jekyll容器(docker run --rm jekyll:xyz -v ...:...),--rm将在完成后将其移除。然后用实际服务器docker-compose up

评论


我实际上不得不做一个小变通方法。首先运行Jekyll(SSG),然后通过busybox容器将其输出的HTML站点复制到命名卷中,然后装入该卷。我应该如何以及在何处发布相关代码?

–莫里茨
18年2月11日在8:12

@Moritz,很高兴您能正常工作。您可以在此处进行自我解答,也可以只编辑问题。

– AnoE
18年2月11日在9:46