使用本地npm依赖性设置docker nodejs应用程序
我们希望开始容纳我们的应用程序,但是我们偶然发现了一些本地依赖的问题。
我们有一个git仓库,在这个仓库中有许多节点包,在“共享”文件夹下,以及需要这些包的应用程序。
假设我们的文件夹结构如下所示:
src/ ├── apps │ └── my_app └── shared └── shared_module
在my_app package.json中,我们有以下依赖关系:
{ "dependencies": { "shared-module": "file:../../shared/shared_module" } }
这里的问题是,因为我们想要移动“my_app”在容器中运行,我们需要npm安装我们的本地依赖。
可以这样做吗?
是的,这可能有点难看。 对于你来说,问题是Docker在构build上下文时是非常严格的。 我不确定你对这个概念有多熟悉,所以下面是文档的介绍:
docker
docker build
命令从Dockerfile和上下文构build一个映像。
例如, docker build .
用途.
作为其构build上下文 ,并且因为没有另外指定, ./Dockerfile
将./Dockerfile作为Dockerfile。 构build上下文之外的文件或path不能在Dockerfile中引用(所以不能COPY ..
)。
你的问题是,在Docker构build期间, 构build上下文不能被留下。 如果您有多个要构build的应用程序,则通常会为每个应用程序添加一个Dockerfile
。
src/ ├── apps │ ├── my_app │ │ └── Dockerfile │ └── my_other_app │ └── Dockerfile └── shared └── shared_module
自然,你会cd
到my_app
并使用docker build .
构build应用程序的Docker镜像。 这个问题是你不能从构build中访问../../shared
,因为它在上下文之外。
因此,您需要确保apps
和shared
位于构build上下文中 。 一种方法是将所有的Dockerfile
放在src
如下所示:
src/ ├── Dockerfile.my_app ├── Dockerfile.my_other ├── apps │ ├── my_app │ └── my_other_app └── shared └── shared_module
然后,您可以通过显式指定上下文和Dockerfile来构build应用程序:
src$ docker build -f Dockerfile.my_app .
或者,您可以将Dockerfiles保存在my_app
和my_other_app
,并指向它们:
src$ docker build -f apps/my_app/Dockerfile .
这也应该工作。 在这两种情况下,构build都是在src
执行的,这意味着您需要对Dockerfile中的path稍加注意。 工作目录仍然是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
希望能帮助你开始。