node.js - 使用本地 npm 依赖项设置 docker nodejs 应用程序

标签 node.js docker npm dockerfile

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

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

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

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

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

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

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

这可以做到吗?

最佳答案

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

The docker build command builds an image from a Dockerfile and a context.

例如,docker build . 使用 . 作为它的build context,并且由于没有另外指定,./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

希望对您有所帮助。

关于node.js - 使用本地 npm 依赖项设置 docker nodejs 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654215/

相关文章:

node.js - 如何计算组聚合的评分?

javascript - 如何从不同环境中托管的文件执行 Heroku 托管的 node.js 文件中的函数?

javascript - 我的 ng-click 和 ng-if 在托管后不起作用

docker - 如何使用项目解决方案创建 docker 容器,其中 lib 项目位于比构建上下文高一级的位置

scala - 使用sbt-native-packager构建docker软件包时出现重复映射

javascript - .babelrc 中指定的未知插件 "static-fs"?

angularjs - 如何修复 npm UNMET PEER DEPENDENCY 警告?

javascript - 使用node.js创建大文件

docker - traefik docker 上的错误网关

node.js - 为 @angular/cli 安装在 Mac 上不工作