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

How to organize shared libraries with docker and monorepo

我有什么

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

目前我的文件布局如下:

+ myproject
  + appA
  | + python backend A
  | + js frontend
  + appB
  | + B stuff
  + libs
    + lib1
    + lib2

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

appB单独部署

如果有任何不同,所有开发都在 linux。

我需要什么

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

我试过的

我确信有一种干净的方法可以做到这一点,但我想不出来。我知道我可以将 repo 分解成更小的 repo 并安装依赖项,但是开发仍然会在 docker 内部引起问题,因为每次更改 lib 文件时我仍然需要重建容器,所以我宁愿保留单一仓库。

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

@ckaserer your suggestion seems to work, indeed. In short, in the docker files I do COPY ../libs/lib1 /app/lib1 and then for local development, I mount ../libs/lib1 onto /app/lib1. That gives me the behavior I was looking for. I use a split docker-compose file for this. The setup causes a few issues with various tools needing some extra config so they know that the libs are part of the code base, but nothing impossible. Thanks for the idea!

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

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