使用本地npm依赖项设置docker nodejs应用程序

Rom*_*anY 7 node.js npm docker dockerfile

我们想开始容器化我们的应用程序,但是偶然发现了本地依赖项的一些问题。

我们只有一个git存储库,其中在“共享”文件夹下有许多节点程序包,以及需要这些程序包的应用程序。

所以说我们的文件夹结构如下:

src/
??? apps
?   ??? my_app
??? shared
    ??? shared_module
Run Code Online (Sandbox Code Playgroud)

在my_app package.json中,我们具有以下依赖关系:

{
  "dependencies": {
    "shared-module": "file:../../shared/shared_module"
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是,因为我们要移动“ my_app”在容器中运行,所以需要npm安装我们的本地依赖项。

能做到吗?

jdn*_*dno 9

是的,这可能,但有点难看。您遇到的问题是,在构建上下文方面,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
Run Code Online (Sandbox Code Playgroud)

自然,您会cd进入my_appdocker build .用来构建应用程序的Docker映像。这样做的问题是您无法../../shared从内部版本访问,因为它不在上下文中。

因此,您需要确保appsshared都在构建上下文中。一种方法是将所有Dockerfilesrc像这样:

src/
??? Dockerfile.my_app
??? Dockerfile.my_other
??? apps
?   ??? my_app
?   ??? my_other_app
??? shared
    ??? shared_module
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过显式指定上下文和Dockerfile来构建应用程序:

src$ docker build -f Dockerfile.my_app .
Run Code Online (Sandbox Code Playgroud)

或者,您可以将Dockerfile保留在my_app和中my_other_app,并指向它们:

src$ docker build -f apps/my_app/Dockerfile .
Run Code Online (Sandbox Code Playgroud)

那也应该起作用。在这两种情况下,构建都是从内部执行的src,这意味着您需要稍微注意Dockerfile中的路径。该工作目录仍是src

COPY ./apps/my_app /src/apps/my_app
Run Code Online (Sandbox Code Playgroud)

通过镜像本地拥有的文件夹结构,您应该能够使依赖项正常工作而无需进行任何更改:

RUN mkdir -p /src
COPY ./shared /src/shared
COPY ./apps/my_app /src/apps/my_app
RUN cd /src/apps/my_app && npm install
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助。

  • 有人设法使用本地 NPM 构建 docker,例如:"shared-module": "file:../../shared/shared_module"?我得到 cb() 从未被调用 (2认同)