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

Posted

技术标签:

【中文标题】使用本地 npm 依赖项设置 docker nodejs 应用程序【英文标题】:Setting up docker nodejs application with local npm dependencies 【发布时间】:2017-11-23 01:35:04 【问题描述】:

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

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

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

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

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


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

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

这个可以吗?

【问题讨论】:

【参考方案1】:

是的,这是可能的,但有点难看。您的问题是 Docker 在其构建上下文方面非常严格。我不确定你对这个概念有多熟悉,所以这里是来自documentation的介绍:

docker build 命令从 Dockerfile 和 context 构建映像。

例如,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 .

或者,您可以将 Dockerfile 保存在 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

希望能帮助您入门。

【讨论】:

非常感谢!我们将在这里尝试并发表评论。 有人设法使用本地 NPM 构建 docker,例如:“shared-module”:“file:../../shared/shared_module”?我得到 cb() 从未被调用 同样的问题。我认为实现这一点的方法是共享卷.. 但我仍然做不到。

以上是关于使用本地 npm 依赖项设置 docker nodejs 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

npm install:有没有办法忽略 package.json 中的特定依赖项

NPM 安装被阻止 - 通过本地文件系统导入依赖项

Docker `npm install` 与 TypeScript 中的 GitHub 私有 repo 依赖项

node项目怎么在离线环境生成容器镜像

如何使用 npm install 或 yarn 仅安装具有自己版本的 package.json 依赖项

从 npm 本地导入 ES 模块依赖项,无需捆绑/转译第一方源