如何使用 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
appA
和 appB
都使用 lib1
和 lib2
(它们本质上是抽象共享数据库的数据模型)。 appA
是一个包含多个组件的 webapp,并非所有组件都是 python。它被部署为一个涉及一堆容器的 docker 堆栈。
我使用 poetry 管理我的依赖关系,以确保可重现的构建等...每个 python 组件(appA
、appB
...)都有自己的 pyproject.toml
文件、虚拟环境等...
appB
单独部署
如果有任何不同,所有开发都在 linux。
我需要什么
我正在寻找一种干净的方式来处理库:
appA
的开发是在本地 docker-compose
设置中完成的。后端自动重新加载文件更改(使用 docker 卷),我希望它也发生在库中的更改。
appB
的开发更简单,但正在转向 docker,因此问题将是相同的。
我试过的
- 我最初的 "solution" 是将 libs 文件夹复制到
appA
中用于开发的临时位置。它适用于导入,但一旦我想更改 libs 代码(这仍然很常见),它就会变得混乱,因为我需要更改原始文件、复制、重建容器。
- 我尝试将 symlink 库放入后端的 docker 环境中,但是 symlinks 似乎不能很好地与 docker 一起使用(确实如此似乎不遵循 link,所以文件不会在 docker 图像中结束,除非我基本上将文件复制到 docker 构建上下文中,这违背了link.)
- 我已经尝试将每个库打包到一个 python 包中,并通过
poetry add ../../libs/lib1
安装它们,这在 docker 中实际上不起作用,因为路径不匹配,并且然后我回到 symlink 问题。
我确信有一种干净的方法可以做到这一点,但我想不出来。我知道我可以将 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 容器。
我有什么
我有 2 个 python 应用程序共享一些代码,足以让我尝试将共享部分隔离到 modules/packages/libraries 中(我故意使该术语含糊不清,因为我不确定解决方案是什么)。我所有的代码都在一个 monorepo 中,因为我希望克服管理比我们团队成员更多的 repos 的一些烦恼。
目前我的文件布局如下:
+ myproject
+ appA
| + python backend A
| + js frontend
+ appB
| + B stuff
+ libs
+ lib1
+ lib2
appA
和 appB
都使用 lib1
和 lib2
(它们本质上是抽象共享数据库的数据模型)。 appA
是一个包含多个组件的 webapp,并非所有组件都是 python。它被部署为一个涉及一堆容器的 docker 堆栈。
我使用 poetry 管理我的依赖关系,以确保可重现的构建等...每个 python 组件(appA
、appB
...)都有自己的 pyproject.toml
文件、虚拟环境等...
appB
单独部署
如果有任何不同,所有开发都在 linux。
我需要什么
我正在寻找一种干净的方式来处理库:
appA
的开发是在本地docker-compose
设置中完成的。后端自动重新加载文件更改(使用 docker 卷),我希望它也发生在库中的更改。appB
的开发更简单,但正在转向 docker,因此问题将是相同的。
我试过的
- 我最初的 "solution" 是将 libs 文件夹复制到
appA
中用于开发的临时位置。它适用于导入,但一旦我想更改 libs 代码(这仍然很常见),它就会变得混乱,因为我需要更改原始文件、复制、重建容器。 - 我尝试将 symlink 库放入后端的 docker 环境中,但是 symlinks 似乎不能很好地与 docker 一起使用(确实如此似乎不遵循 link,所以文件不会在 docker 图像中结束,除非我基本上将文件复制到 docker 构建上下文中,这违背了link.)
- 我已经尝试将每个库打包到一个 python 包中,并通过
poetry add ../../libs/lib1
安装它们,这在 docker 中实际上不起作用,因为路径不匹配,并且然后我回到 symlink 问题。
我确信有一种干净的方法可以做到这一点,但我想不出来。我知道我可以将 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 容器。