我看到了2017 here中的一个相关问题和2014 here中链接的GitHub讨论,但这种行为对我来说真的没有意义,我想知道是否有什么好的解决方案。
目前,我正在做一个项目,它有一个git仓库作为根目录,还有多个子目录,每个子目录包含一个我在不同的docker容器中运行的服务。到目前为止,这个项目运行得很好,因为这些服务之间没有任何共享代码,然而,随着项目的发展,需求也在变化,我创建了一个小的代码库,希望在两个服务之间共享。这个库不够大,不足以支持git子模块之类的东西,但也不够小,如果代码重复,我希望所有的更新都要进行两次。
例如,在项目根目录中,我有两个目录Foo
和Bar
,它们都包含一个支持库FooBar
。
<root>
|
+- Foo
| |
| +- FooBar
| |
| +- Dockerfile
|
+- Bar
| |
| +- FooBar
| |
| +- Dockerfile
其中FooBar
在两个示例中包含相同的源文件。我本能的解决方案是简单地创建一个符号链接,例如Foo/FooBar
是指向源文件所在的../Bar/FooBar
的链接。根据链接的问题/讨论,这是不支持的。GitHub讨论中给出的推理确实有意义,如果符号链接可以指向主机系统上的任何地方,我可以想象许多不好的结果是可能的,但在我的特定示例中,这两个服务永远不会分开部署,符号链接只是指向另一个docker映像的源。如果我按照自己的意愿设置符号链接,Dockerfile COPY命令似乎只是照原样复制链接。所以它在目标映像中变成了一个死链接。我更希望它跟随符号链接并复制文件本身。
我不是Docker工作方式方面的Maven,虽然我读过一些文档,我完全有可能错过了一个简单的解决方案。有没有什么方法可以设置这个目录结构,以便只有一个共享代码的主副本,可以从我的两个服务中引用?这些特定的服务是用Python开发的,FooBar
库是一个Python模块,如果这有什么不同的话。
1条答案
按热度按时间fnvucqvd1#
这里重要的细节是,一个Dockerfile不能从父目录或兄弟目录将任何内容
COPY
到映像中,这意味着您需要从最近的祖先目录开始构建一个映像,该目录包含您需要包含的所有内容;在您的示例中,是源树的根。这里请注意,
COPY
的左侧相对于docker build
的路径参数,.
位于最末尾,而不是Dockerfile的位置。完成此操作后,在映像内部,从
/app/foo
目录,将有一个../common
目录可作为相对路径访问,如果您将符号链接COPY
到映像或RUN ln -s
中,它将按您预期的方式工作。从你的描述中,你听起来好像公共库代码不是那么大或者那么复杂。这种方法会给每个映像一个单独的副本,但是对于一个小而简单的库来说,这不应该是一个实际的问题。如果应用程序本身很小,你可以只构建一个包含所有内容的映像,然后用不同的命令运行它。这可能是实际的,也可能是不实际的。
还要注意,这里没有涉及Git或任何其他源代码控制系统;它只基于主机系统上实际存在的文件。2你可以用任何你想要的方式来管理这些文件。