Docker找不到本地Node.js模块

时间:2018-11-19 17:36:45

标签: node.js docker npm

我有一个名为my-common的nodejs模块,其中包含几个js文件。这些js文件导出了在许多其他模块中使用的功能。

我的另一个模块(称为demo)包含对通用模块的依赖关系,如下所示:

"dependencies": {
    "my-common": "file:../my-common/",
}

当我进入演示目录并运行npm start时,它运行良好。然后,我使用以下Dockerfile构建一个Docker映像:

FROM node:8 ENV NODE_ENV=production WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --only=production COPY . . EXPOSE 3000 CMD [ "npm", "start" ]

启动图像时,出现错误,找不到我常见的错误。我猜测my-common模块未复制到演示模块的node_modules目录中。

我尝试了npm链接,但是我认为需要sudo权限来安装全局模块是一个非常糟糕的主意,因为这可能会在其他系统上引起问题。

我在根目录中尝试过npm install my-common/,并将模块安装到了我的HOME_DIR / node_modules中,但是没有安装到docker容器中。

在我所看到的每个地方,似乎都无法回答这个非常简单的问题。我该如何解决?

1 个答案:

答案 0 :(得分:2)

所以,我看到了几件不同的事情。

当Docker在映像中运行npm install --only=production时,Docker会看到file:../my-common/并查看Docker映像的WORKDIR的父目录,即/usr/src/app。由于此时package.json之外的任何内容均未复制到映像中,因此无法找到该模块。如果要在本地安装所有内容,然后将其移动到映像中,可以通过从Dockerfile中删除npm install --only=production命令来进行操作,并确保您的.dockerignore文件不会忽略{{1 }}目录。

如果要在映像中安装模块,则需要将my-common目录专门复制到docker映像中。但是,Docker不允许您将某些内容从父目录复制到映像中。任何本地内容都必须在Dockerfile的上下文中。您有两种选择:

选项1:node_modules移至项目的根目录,更新Dockerfile以复制该文件夹,并更新package.json以指向正确的位置。

Dockerfile:

my-common/

package.json:

FROM node:8
ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY my-common/ ./
COPY package*.json ./
RUN npm install --only=production
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]

选项2 :将Docker映像的上下文上移一个目录。我的意思是将Dockerfile移至"dependencies": { "my-common": "file:./my-common/", } 目录的同一级别,并更新Dockerfile和package.json以反映该更改。

Dockerfile:

my-common

package.json:

FROM node:8
ENV NODE_ENV=production
WORKDIR /usr/src/app
RUN mkdir my-common
COPY ./my-common ./my-common
COPY ./<projectName>/package*.json .
RUN npm install --only=production
COPY ./<projectName> .
EXPOSE 3000
CMD [ "npm", "start" ]