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

val*_*lya 5 git shared-access docker

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

所以,我有两个文件夹:

part1/
    Dockerfile
    src/
part2/
    Dockerfile
    src/
Run Code Online (Sandbox Code Playgroud)

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

有些文件需要在建筑物一步,所以我不能使用的“绑定安装卷”选项docker run-docker run为时已晚。

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

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

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

我认为我的情况并不少见,尤其是在座右铭“将应用程序解耦到多个容器中”的情况下。所以可能有很好的方法来处理它。有什么线索吗?

小智 0

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

\n

它叫做沙子,你可以在这里找到它

\n

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

\n

给定以下目录结构:

\n
my-monorepo/\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tweet-service/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Sandfile\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 home-timeline/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Sandfile\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Sandfile\n
Run Code Online (Sandbox Code Playgroud)\n

你可以Sandfile这样写你的 s :

\n
my-monorepo/\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tweet-service/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Sandfile\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 home-timeline/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Sandfile\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Sandfile\n
Run Code Online (Sandbox Code Playgroud)\n
# ./my-monorepo/Sandfile\nfrom sand import *\n\ndef MyService(name):\n    From("ubuntu", "20.04")\n    Run("apt-get install python3")\n    Copy(Src="src", Dst="/app")\n    Entrypoint(f"python3 /app/{name}.py")\n\nSand("tweet-service")\nSand("home-timeline")\n
Run Code Online (Sandbox Code Playgroud)\n
# ./my-monorepo/tweet-service/Sandfile\nfrom sand import *\n\nMyService("tweet-service") # Defined in ../Sandfile\n
Run Code Online (Sandbox Code Playgroud)\n