我有一个名为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容器中。
在我所看到的每个地方,似乎都无法回答这个非常简单的问题。我该如何解决?
答案 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" ]