我是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'
我尝试过相关问题的其他解决方案,但似乎没有什么对我有用(或者我知道......我只是对此有所了解)
谢谢!
答案 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。正如文档所说,主机目录的预先存在的内容不会被删除,但是没有关于容器的现有目录上发生什么的信息。
有一个例子可以支持我的意见。
Dockerfile
FROM alpine:latest
WORKDIR /usr/src/app
COPY . .
我在Dockerfile的同一目录中创建了一个 test.t 文件。
证明
docker build -t test-1 .
docker run --name test-c-1 -it test-1 /bin/sh
,然后您的容器将打开bash。ls -l
,它将显示test.t文件。docker run --name test-c-2 -v /home:/usr/src/app -it test-1 /bin/sh
。您无法在 test-c-2 容器中找到 test.t 文件。这就是全部。我希望它能帮助你。
答案 1 :(得分:0)
我最近遇到了类似的问题。 深入研究docker docs后,我发现当您运行命令
时docker run -p 49160:8080 -v〜/ Documentos / nodeApp:/ home / Documents / node-app node-cont
主机上的目录(在-v选项参数中':'的左侧)将安装在目标目录中(在容器中)## / home / Documents / node-app ## 并且由于您的目标目录是工作目录,因此非空,因此
“目录的现有内容被绑定安装遮盖了。”