使用本地npm依赖项

时间:2017-06-20 13:18:27

标签: node.js docker npm dockerfile

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

我们有一个git存储库,我们有许多节点包,在" shared"文件夹和需要这些软件包的应用程序。

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

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

在my_app package.json中我们有以下依赖项:

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

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

可以这样做吗?

1 个答案:

答案 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,因为它不在上下文中。

因此,您需要确保appsshared都在构建上下文中。一种方法是将所有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_appmy_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

希望能帮助您入门。