Rom*_*anY 7 node.js npm docker dockerfile
我们想开始容器化我们的应用程序,但是偶然发现了本地依赖项的一些问题。
我们只有一个git存储库,其中在“共享”文件夹下有许多节点程序包,以及需要这些程序包的应用程序。
所以说我们的文件夹结构如下:
src/
??? apps
? ??? my_app
??? shared
??? shared_module
Run Code Online (Sandbox Code Playgroud)
在my_app package.json中,我们具有以下依赖关系:
{
"dependencies": {
"shared-module": "file:../../shared/shared_module"
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,因为我们要移动“ my_app”在容器中运行,所以需要npm安装我们的本地依赖项。
能做到吗?
是的,这可能,但有点难看。您遇到的问题是,在构建上下文方面,Docker的限制非常严格。我不确定您对这个概念是否熟悉,所以这里是文档的介绍:
该
docker build命令从Dockerfile和上下文构建映像。
例如,docker build .将.用作其构建上下文,并且由于未另行指定,因此./Dockerfile将其用作Dockerfile。无法在Dockerfile中引用构建上下文外部的文件或路径(因此no COPY ..)。
您遇到的问题是,在Docker构建期间,无法保留构建上下文。如果您要构建多个应用程序,通常会Dockerfile为每个应用程序添加一个。
src/
??? apps
? ??? my_app
? ? ??? Dockerfile
? ??? my_other_app
? ??? Dockerfile
??? shared
??? shared_module
Run Code Online (Sandbox Code Playgroud)
自然,您会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
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过显式指定上下文和Dockerfile来构建应用程序:
src$ docker build -f Dockerfile.my_app .
Run Code Online (Sandbox Code Playgroud)
或者,您可以将Dockerfile保留在my_app和中my_other_app,并指向它们:
src$ docker build -f apps/my_app/Dockerfile .
Run Code Online (Sandbox Code Playgroud)
那也应该起作用。在这两种情况下,构建都是从内部执行的src,这意味着您需要稍微注意Dockerfile中的路径。该工作目录仍是src:
COPY ./apps/my_app /src/apps/my_app
Run Code Online (Sandbox Code Playgroud)
通过镜像本地拥有的文件夹结构,您应该能够使依赖项正常工作而无需进行任何更改:
RUN mkdir -p /src
COPY ./shared /src/shared
COPY ./apps/my_app /src/apps/my_app
RUN cd /src/apps/my_app && npm install
Run Code Online (Sandbox Code Playgroud)
希望对您有所帮助。
| 归档时间: |
|
| 查看次数: |
1957 次 |
| 最近记录: |