我是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
我想念什么?
谢谢
答案 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