使用本地 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
,因为它在上下文之外。
所以您需要确保apps
和shared
都在构建上下文中。一种方法是将所有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_app
和 my_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 中的特定依赖项
Docker `npm install` 与 TypeScript 中的 GitHub 私有 repo 依赖项