Docker容器之间的共享代码库

7nbnzgx9  于 2023-02-03  发布在  Docker
关注(0)|答案(1)|浏览(287)

我看到了2017 here中的一个相关问题和2014 here中链接的GitHub讨论,但这种行为对我来说真的没有意义,我想知道是否有什么好的解决方案。
目前,我正在做一个项目,它有一个git仓库作为根目录,还有多个子目录,每个子目录包含一个我在不同的docker容器中运行的服务。到目前为止,这个项目运行得很好,因为这些服务之间没有任何共享代码,然而,随着项目的发展,需求也在变化,我创建了一个小的代码库,希望在两个服务之间共享。这个库不够大,不足以支持git子模块之类的东西,但也不够小,如果代码重复,我希望所有的更新都要进行两次。
例如,在项目根目录中,我有两个目录FooBar,它们都包含一个支持库FooBar

<root>
|
+- Foo
|  |
|  +- FooBar
|  |
|  +- Dockerfile
|
+- Bar
|  |
|  +- FooBar
|  |
|  +- Dockerfile

其中FooBar在两个示例中包含相同的源文件。我本能的解决方案是简单地创建一个符号链接,例如Foo/FooBar是指向源文件所在的../Bar/FooBar的链接。根据链接的问题/讨论,这是不支持的。GitHub讨论中给出的推理确实有意义,如果符号链接可以指向主机系统上的任何地方,我可以想象许多不好的结果是可能的,但在我的特定示例中,这两个服务永远不会分开部署,符号链接只是指向另一个docker映像的源。如果我按照自己的意愿设置符号链接,Dockerfile COPY命令似乎只是照原样复制链接。所以它在目标映像中变成了一个死链接。我更希望它跟随符号链接并复制文件本身。
我不是Docker工作方式方面的Maven,虽然我读过一些文档,我完全有可能错过了一个简单的解决方案。有没有什么方法可以设置这个目录结构,以便只有一个共享代码的主副本,可以从我的两个服务中引用?这些特定的服务是用Python开发的,FooBar库是一个Python模块,如果这有什么不同的话。

fnvucqvd

fnvucqvd1#

这里重要的细节是,一个Dockerfile不能从父目录或兄弟目录将任何内容COPY到映像中,这意味着您需要从最近的祖先目录开始构建一个映像,该目录包含您需要包含的所有内容;在您的示例中,是源树的根。

# foo/Dockerfile
FROM something
COPY common/ /app/common/
COPY foo/ /app/foo/
WORKDIR /app/foo
...
# in a shell, at the root of the source tree
docker build -f foo/Dockerfile .

这里请注意,COPY的左侧相对于docker build的路径参数,.位于最末尾,而不是Dockerfile的位置。
完成此操作后,在映像内部,从/app/foo目录,将有一个../common目录可作为相对路径访问,如果您将符号链接COPY到映像或RUN ln -s中,它将按您预期的方式工作。
从你的描述中,你听起来好像公共库代码不是那么大或者那么复杂。这种方法会给每个映像一个单独的副本,但是对于一个小而简单的库来说,这不应该是一个实际的问题。如果应用程序本身很小,你可以只构建一个包含所有内容的映像,然后用不同的命令运行它。这可能是实际的,也可能是不实际的。
还要注意,这里没有涉及Git或任何其他源代码控制系统;它只基于主机系统上实际存在的文件。2你可以用任何你想要的方式来管理这些文件。

相关问题