找不到模块“表达”(带有docker的节点应用)

Ger*_*ona 2 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"]
Run Code Online (Sandbox Code Playgroud)

当我运行一个容器时,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'

我已经尝试了相关问题的其他解决方案,但似乎对我没有任何帮助(或者我知道。我对此太新手了)

谢谢 !!

Mer*_*han 6

当您使用-v标志运行容器时,这意味着将Docker引擎主机上的目录装载到容器中,将覆盖/ home / Documents / node-app中的操作,例如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命令的预期行为一致。

将主机目录作为数据卷挂载。正如文档所述,主机目录的先前内容不会被删除,但是不会提供有关容器的现有目录上正在发生什么的信息。

有一个例子可以支持我的观点。

  1. Docker文件

    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. ls -l在您的容器bash中运行命令,它将显示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。

仅此而已,希望对您有所帮助。