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

我们希望开始容纳我们的应用程序,但是我们偶然发现了一些本地依赖的问题。

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

假设我们的文件夹结构如下所示:

src/ ├── apps │  └── my_app └── shared └── shared_module 

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

 { "dependencies": { "shared-module": "file:../../shared/shared_module" } } 

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

可以这样做吗?

是的,这可能有点难看。 对于你来说,问题是Docker在构build上下文时是非常严格的。 我不确定你对这个概念有多熟悉,所以下面是文档的介绍:

docker docker build命令从Dockerfile和上下文构build一个映像。

例如, docker build . 用途. 作为其构build上下文 ,并且因为没有另外指定, ./Dockerfile将./Dockerfile作为Dockerfile。 构build上下文之外的文件或path不能在Dockerfile中引用(所以不能COPY .. )。

你的问题是,在Docker构build期间, 构build上下文不能被留下。 如果您有多个要构build的应用程序,则通常会为每个应用程序添加一个Dockerfile

 src/ ├── apps │ ├── my_app │ │ └── Dockerfile │ └── my_other_app │ └── Dockerfile └── shared └── shared_module 

自然,你会cdmy_app并使用docker build . 构build应用程序的Docker镜像。 这个问题是你不能从构build中访问../../shared ,因为它在上下文之外。

因此,您需要确保appsshared位于构build上下文中 。 一种方法是将所有的Dockerfile放在src如下所示:

 src/ ├── Dockerfile.my_app ├── Dockerfile.my_other ├── apps │ ├── my_app │ └── my_other_app └── shared └── shared_module 

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

 src$ docker build -f Dockerfile.my_app . 

或者,您可以将Dockerfiles保存在my_appmy_other_app ,并指向它们:

 src$ docker build -f apps/my_app/Dockerfile . 

这也应该工作。 在这两种情况下,构build都是在src执行的,这意味着您需要对Dockerfile中的path稍加注意。 工作目录仍然是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 

希望能帮助你开始。