具有多个包和共享源的 Docker 工作流

具有多个包和共享源的 Docker 工作流

假设我想将 Docker 用于一个应用程序,它由两部分组成。这两个部分是不同的,但它们有一些共享库。

因此,我有两个文件夹:

part1/
    Dockerfile
    src/
part2/
    Dockerfile
    src/

但是,我希望它们共享一些文件(例如,库),因为 DRY。不幸的是,似乎没有任何好的目录结构可以让我做到这一点:Dockerfile 不能引用父文件夹,而且我不能将它们都放在顶级文件夹中,因为我不允许更改 Dockerfile 的名称。

其中一些文件是构建步骤中需要的,所以我无法使用“绑定挂载卷”选项docker run-为时docker run已晚。

我看到了这些选项,但我不喜欢它们:

  1. 我可以添加一个名为 的文件夹shared/,并使用 hack 将其“放入”我的两个应用程序文件夹中。这些 hack 包括以某种方式挂载它(这很烦人,每次都需要我这样做,而且我试图向他们推销 Docker 的同事也难以理解)或在构建之前复制它(如果我将构建隐藏到构建脚本中,在构建之前复制文件夹并在构建之后将其删除,这是可行的;但是,即使共享文件夹没有更改,它也会使构建缓存无效,并且容易出现错误)

  2. 我可以将项目拆分为 3 个不同的项目,然后使用 git-sub-something 将它们链接在一起。这种配置很难使用(或者我不知道该怎么做)。

我认为我的情况并不罕见,尤其是有“将应用程序解耦为多个容器”的座右铭。所以可能有很好的方法来解决这个问题。有什么线索吗?

答案1

我知道有点晚了,但由于同样的问题而感到沮丧,我最终编写了自己的框架来生成Dockerfiles。

它被称为沙子,你可以找到它这里

它允许你在 s 之间共享代码Sandfile,这些代码稍后会被转换为Dockerfiles

给定以下目录结构:

my-monorepo/
├── tweet-service/
|   ├── src/
|   ├── ...
│   └── Sandfile
├── home-timeline/
|   ├── src/
|   ├── ...
│   └── Sandfile
└── Sandfile

你可以Sandfile像这样写:

# ./my-monorepo/Sandfile
from sand import *

def MyService(name):
    From("ubuntu", "20.04")
    Run("apt-get install python3")
    Copy(Src="src", Dst="/app")
    Entrypoint(f"python3 /app/{name}.py")

Sand("tweet-service")
Sand("home-timeline")
# ./my-monorepo/tweet-service/Sandfile
from sand import *

MyService("tweet-service") # Defined in ../Sandfile
# ./my-monorepo/home-timeline/Sandfile
from sand import *

MyService("home-timeline") # Defined in ../Sandfile

相关内容