Docker + Nodejs出现错误:找不到“针对我编写的模块”的模块

时间:2019-09-10 16:19:07

标签: node.js docker

我是Docker初学者。 我能够为我的nodejs项目实现docker,但是当我尝试将其拉出时出现错误

Error: Cannot find module 'my_db' 

(my_db是我编写的用于处理mysql功能的模块)。

所以我猜我的模块没有捆绑到docker镜像中,对吧? 我将模块移动到了名为my_node_modules /的文件夹中,因此不会被忽略。 我还对Dockerfile进行了如下修改:

FROM node:11.10.1
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./my_node_modules/*", "./"]
RUN npm install --production --silent && mv node_modules ../
COPY . .
EXPOSE 3000
CMD node index.js

我想念什么?

谢谢

2 个答案:

答案 0 :(得分:1)

我会做这样的事情。首先创建一个.dockerignore

.git
node_modules

以上内容可确保将node_modules文件夹从实际的构建上下文中排除。

您应该将所有临时内容添加到.dockerignore中。由于构建上下文会更小,因此这也会加快实际构建的速度。

然后在我的docker文件中,我首先仅复制package.json和任何现有的锁定文件,以便能够缓存此层:

FROM node:11.10.1
ENV NODE_ENV production
WORKDIR /usr/src/app
# Only copy package* before installing to make better use of cache
COPY package*.json .
RUN npm install --production --silent
# Copy everything
COPY . .
EXPOSE 3000
CMD node index.js

就像我也在评论中写道的那样,我不知道你为什么这么做mv node_modules ../?这样会将node_modules目录从/usr/src/app文件夹中移出,这不是您想要的。

很高兴看到您实际上是如何包含模块的。

如果您自己的模块位于以下文件夹my_node_modules/my_db中,则在上述docker文件中执行COPY . .时,它将被复制。然后,在您的index.js文件中,您应该可以使用如下模块:

const db = require('./my_node_modules/my_db');

答案 1 :(得分:0)

COPY . .此步骤将覆盖当前目录中的所有内容,因此不建议从Host复制节点模块,如果为Windows编译了主机biners,而您正在使用Linux容器,则可能会破坏容器。

最好重构Dockerfile并在docker中安装模块,而不是从主机复制。

FROM node:11.10.1
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY . .
RUN npm install --production --silent
EXPOSE 3000
CMD node index.js

也将建议使用.dockerignore

# add git-ignore syntax here of things you don't want copied into docker image

.git
*Dockerfile*
*docker-compose*
node_modules