如何使用 docker 和 monorepo 组织共享库

Lau*_*t S 5 python docker docker-compose python-poetry

我拥有的

我有 2 个 python 应用程序共享一些代码,足以让我尝试将共享部分隔离到模块/包/库中(我故意使术语含糊不清,因为我不确定解决方案是什么) 。我的所有代码都在单一存储库中,因为我希望克服管理比我们团队成员更多的存储库的一些烦恼。

目前我的文件布局如下所示:

+ myproject
  + appA
  | + python backend A
  | + js frontend
  + appB
  | + B stuff
  + libs
    + lib1
    + lib2
Run Code Online (Sandbox Code Playgroud)

appAappB使用lib1lib2(它们本质上是抽象共享数据库的数据模型)。appA是一个具有多个组件的Web应用程序,并非所有组件都是Python的。它被部署为涉及一堆容器的 Docker 堆栈。我用诗歌来管理我的依赖关系,以确保可重复的构建等...每个 python 组件(appAappB...)都有自己的pyproject.toml文件,虚拟环境等...

appB是单独部署的。

如果有什么区别的话,所有开发都在 Linux 上进行。

我需要的

我正在寻找一种干净的方法来处理库:

  • 的开发appA是在本地docker-compose设置中完成的。后端会在文件更改时自动重新加载(使用 docker 卷),我希望库中的更改也能发生这种情况。
  • 开发appB更简单,但正在迁移到 docker,所以问题将是相同的。

我尝试过的

  • 我最初的“解决方案”是将 libs 文件夹复制到临时位置以在appA. 它适用于导入,但一旦我想更改库代码(这仍然很常见),它就会很混乱,因为我需要更改原始文件,复制,重建容器。
  • 我尝试将库符号链接到后端的 docker 环境中,但符号链接似乎不能很好地与 docker 配合使用(它似乎没有遵循链接,因此文件不会最终出现在 docker 映像中,除非我基本上复制了docker 构建上下文中的文件,这违背了链接的目的。)
  • 我尝试将每个库打包到一个 python 包中,并通过它安装它们poetry add ../../libs/lib1,因为路径不匹配,所以在 docker 中实际上不起作用,然后我又回到了符号链接问题。

我确信有一种干净的方法可以做到这一点,但我无法弄清楚。我知道我可以将存储库分解为较小的存储库并安装依赖项,但开发仍然会在 docker 内部引起问题,因为每次更改 lib 文件时我仍然需要重建容器,所以我宁愿保留 monorepo。

Cle*_*rer 1

如果您无论如何都使用 docker-compose,则可以使用卷将本地库挂载到容器中,并能够在主机系统和容器中编辑它们。不是很花哨,但是应该可以,对吧?

@ckaserer 你的建议似乎确实有效。简而言之,在 docker 文件中,我执行 COPY ../libs/lib1 /app/lib1 ,然后为了本地开发,我将 ../libs/lib1 挂载到 /app/lib1 上。这给了我我正在寻找的行为。我为此使用了一个分割的 docker-compose 文件。该设置会导致各种工具出现一些问题,需要一些额外的配置,以便他们知道这些库是代码库的一部分,但没有什么不可能的。谢谢你的主意!

因此,尽管这不是一个理想的解决方案,但通过 app 和 lib 目录本地安装也可以在 Linux 系统上工作。

仅供参考:在 Windows 主机上,如果您想监视文件更改,您可能会遇到麻烦,因为文件更改不会从 Windows 主机传播到 Linux 容器。