作者:暗恋达志_227 | 来源:互联网 | 2023-01-31 18:09
我们想开始容器化我们的应用程序,但是偶然发现了本地依赖项的一些问题。
我们只有一个git存储库,其中在“共享”文件夹下有许多节点程序包,以及需要这些程序包的应用程序。
所以说我们的文件夹结构如下:
src/
??? apps
? ??? my_app
??? shared
??? shared_module
在my_app package.json中,我们具有以下依赖关系:
{
"dependencies": {
"shared-module": "file:../../shared/shared_module"
}
}
这里的问题是,因为我们要移动“ my_app”在容器中运行,所以需要npm安装我们的本地依赖项。
能做到吗?
1> jdno..:
是的,这可能,但有点难看。您遇到的问题是,在构建上下文方面,Docker的限制非常严格。我不确定您对这个概念是否熟悉,所以这里是文档的介绍:
该docker build
命令从Dockerfile和上下文构建映像。
例如,docker build .
将.
用作其构建上下文,并且由于未另行指定,因此./Dockerfile
将其用作Dockerfile。无法在Dockerfile中引用构建上下文外部的文件或路径(因此no 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
希望对您有所帮助。