我们希望开始容纳我们的应用程序,但我们偶然发现了一些本地依赖的问题。
我们有一个git存储库,我们有许多节点包,在" shared"文件夹和需要这些软件包的应用程序。
所以,让我们说我们的文件夹结构如下:
src/
├── apps
│ └── my_app
└── shared
└── shared_module
在my_app package.json中我们有以下依赖项:
{
"dependencies": {
"shared-module": "file:../../shared/shared_module"
}
}
这里的问题是因为我们想要移动" my_app"要在容器中运行,我们需要npm安装我们的本地依赖项。
可以这样做吗?
答案 0 :(得分:4)
是的,它可能但有点难看。您遇到的问题是Docker在其构建上下文方面非常严格。我不确定你对这个概念有多熟悉,所以这里是documentation的介绍:
docker build
命令从Dockerfile和上下文构建图像。
例如,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 .
或者,您可以将Dockerfiles保留在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
希望能帮助您入门。