无法找到模块'express'(带有docker的节点应用程序)

时间:2016-09-09 20:32:03

标签: node.js express docker

我是Docker的新手,我正在尝试从NodeJS开始,所以这是我的问题..

我的项目中有这个Dockerfile:

FROM node:argon

# Create app directory
RUN mkdir -p /home/Documents/node-app
WORKDIR /home/Documents/node-app

# Install app dependencies
COPY package.json /home/Documents/node-app
RUN npm install

# Bundle app source
COPY . /home/Documents/node-app

EXPOSE 8080
CMD ["npm", "start"]

当我使用docker run -d -p 49160:8080 node-container运行容器时,它工作正常..

但是当我尝试使用容器目录(docker run -p 49160:8080 -v ~/Documentos/nodeApp:/home/Documents/node-app node-cont)映射我的主机项目时,它不起作用。

我得到的错误是:Error: Cannot find module 'express'

我尝试过相关问题的其他解决方案,但似乎没有什么对我有用(或者我知道......我只是对此有所了解)

谢谢!

2 个答案:

答案 0 :(得分:4)

使用 -v 标志运行容器时,这意味着将目录从Docker引擎的主机安装到容器中,将覆盖您在 / home / Documents / node-中执行的操作应用,例如npm install。

因此,您无法在容器中看到 node_modules目录

  

$ docker run -d -P --name web -v / src / webapp:/ webapp training / webapp python app.py

     

此命令将主机目录/ src / webapp安装到/ webapp的容器中。如果路径/ webapp已经存在于容器的映像中,则/ src / webapp挂载覆盖但不会删除预先存在的内容。删除安装后,可以再次访问该内容。这与mount命令的预期行为一致。

mount a host directory as a data volume。正如文档所说,主机目录的预先存在的内容不会被删除,但是没有关于容器的现有目录上发生什么的信息。

有一个例子可以支持我的意见。

  1. Dockerfile

    FROM alpine:latest WORKDIR /usr/src/app COPY . .

  2. 我在Dockerfile的同一目录中创建了一个 test.t 文件。

  3. 证明

    1. 运行命令docker build -t test-1 .
    2. 运行命令docker run --name test-c-1 -it test-1 /bin/sh,然后您的容器将打开bash。
    3. 在容器bash中运行命令ls -l,它将显示test.t文件。
    4. 只需使用相同的图片。
    5. 运行命令docker run --name test-c-2 -v /home:/usr/src/app -it test-1 /bin/sh。您无法在 test-c-2 容器中找到 test.t 文件。
  4. 这就是全部。我希望它能帮助你。

答案 1 :(得分:0)

我最近遇到了类似的问题。 深入研究docker docs后,我发现当您运行命令

docker run -p 49160:8080 -v〜/ Documentos / nodeApp:/ home / Documents / node-app node-cont

主机上的目录(在-v选项参数中':'的左侧)将安装在目标目录中(在容器中)## / home / Documents / node-app ## 并且由于您的目标目录是工作目录,因此非空,因此

  

“目录的现有内容被绑定安装遮盖了。”