是的,这是可能的,但有点难看。您的问题是 Docker 在其构建上下文方面非常严格。我不确定你对这个概念有多熟悉,所以这里是来自documentation的介绍:
docker build 命令从 Dockerfile 和 context 构建映像。
例如,docker build . 使用. 作为它的构建上下文,并且由于没有另外指定,./Dockerfile 作为 Dockerfile。 构建上下文之外的文件或路径不能在 Dockerfile 中被引用(所以没有COPY ..)。
您的问题是,在 Docker 构建期间,构建上下文 不能保留。如果您要构建多个应用程序,通常会为每个应用程序添加一个Dockerfile。
src/
├── apps
│ ├── my_app
│ │ └── Dockerfile
│ └── my_other_app
│ └── Dockerfile
└── shared
└── shared_module
当然,您可以将cd 转换为my_app 并使用docker build . 来构建应用程序的Docker 映像。这个问题是你不能从构建中访问../../shared,因为它在上下文之外。
所以您需要确保apps 和shared 都在构建上下文中。一种方法是将所有Dockerfile 放在src 中,如下所示:
src/
├── Dockerfile.my_app
├── Dockerfile.my_other
├── apps
│ ├── my_app
│ └── my_other_app
└── shared
└── shared_module
然后您可以通过显式指定上下文和 Dockerfile 来构建应用程序:
src$ docker build -f Dockerfile.my_app .
或者,您可以将 Dockerfile 保存在 my_app 和 my_other_app 中,并指向它们:
src$ docker build -f apps/my_app/Dockerfile .
这也应该有效。在这两种情况下,构建都是从src 中执行的,这意味着您需要稍微注意一下 Dockerfile 中的路径。 工作目录仍然是src:
COPY ./apps/my_app /src/apps/my_app
通过镜像您在本地的文件夹结构,您应该能够在不进行任何更改的情况下使您的依赖项工作:
RUN mkdir -p /src
COPY ./shared /src/shared
COPY ./apps/my_app /src/apps/my_app
RUN cd /src/apps/my_app && npm install
希望能帮助您入门。