跨多个 docker-compose 项目的共享卷 [重复]

Posted

技术标签:

【中文标题】跨多个 docker-compose 项目的共享卷 [重复]【英文标题】:Shared volume across multiple docker-compose projects [duplicate] 【发布时间】:2021-05-08 14:13:48 【问题描述】:

我正在使用docker-compose 为多个单独的项目编排容器。这些项目中的每一个都有自己的一组容器,并且与其他项目无关。

例如:

/my-projects/project-1/docker-compose.yml
/my-projects/project-2/docker-compose.yml
/my-projects/project-3/docker-compose.yml

然而,这些项目的相似之处在于它们都是 php 项目,并且使用 webpack 作为前端资产,因此共享相同的包管理器:composeryarn

出于性能考虑,我想知道是否可以在所有项目的目录根目录之外为包管理器缓存挂载一个共享卷?

例如:

/my-projects/caches/composer
/my-projects/caches/npm
/my-projects/project-1/docker-compose.yml
/my-projects/project-2/docker-compose.yml
/my-projects/project-3/docker-compose.yml

/my-projects/caches/composer/my-projects/caches/npm 安装在每个项目的相关容器中。如果不清楚,一次只能启动一个项目。

目前,如果两个项目共享相同的 deps,则每个项目都会单独下载并缓存它。更高性能(就构建时间而言)是挂载一个公共卷并将包管理器的缓存指向那里,这样当“项目 A”下载到 dip 的更新时,“项目 B”可以从缓存中加载它。

【问题讨论】:

如果您打算使用绑定挂载 - 那么只需挂载它。没有额外的配置,只需要在任意多个容器中绑定挂载一个目录即可。 谢谢@anemyte!据我所知,docker-compose 文件中描述的挂载是相对/受限于项目的根目录——这些是项目之外的目录。 太棒了,我错过了!我会试验一下,看看有什么用。在这些项目中,composer.json 等在映像构建时不可用,因此作为单独的构建过程运行。谢谢大家。 绝对路径和相对路径(通过..)都有效。是 Dockerfile 被限制在某个上下文根中,而不是 docker-compose.yml。 谢谢大家,这一切都非常有用 - 我确实对 Dockerfile 限制和 docker-compose [缺乏] 在这方面的限制感到困惑。 @NicoHaase 很有用,谢谢。 【参考方案1】:

您可以简单地在每个需要它的容器上挂载与卷绑定相同的目录。你can use absolute paths。甚至文档中的一个示例也使用绝对路径作为绑定挂载。

但是,在映像构建期间,卷不可用(docker-compose build,在任何情况下都应运行 composer installnpm installyarn install 等命令。

尽管如果您在容器运行时运行这些命令,没有什么能阻止您将这些缓存目录挂载到每个容器中。

【讨论】:

以上是关于跨多个 docker-compose 项目的共享卷 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以跨多个项目共享角度组件?

如何将映像创建的卷与 docker-compose 指定的命名卷链接?

在 Grails 中跨多个插件共享身份验证

跨多个用户共享 BigQuery 的缓存

跨多个应用程序共享存储过程

通过多个 Laravel 5 安装跨子域共享身份验证会话