我们想开始容器化我们的应用程序,但我们偶然发现了一些与本地依赖项有关的问题。
我们有一个单独的 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
,因为它在上下文之外。
因此您需要确保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
希望对您有所帮助。
关于node.js - 使用本地 npm 依赖项设置 docker nodejs 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44654215/