如何在Docker中使用“bind mount”

qjp7pelc  于 2023-05-28  发布在  Docker
关注(0)|答案(5)|浏览(187)

运行此命令后,我在日志中得到一个错误:
docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback -v“/WorkSpace/d/data-volumes-03-adj-node-code:/app”-v /app/node_modules feedback-node:volumes
错误是:
internal/modules/cjs/loader.js:892 throw err;^
错误:无法找到模块“/app/server.js”at Function.Module._resolveFilename(internal/modules/cjs/loader.js:889:15)at Function.Module._load(internal/modules/cjs/loader.js:745:27)at Function.executeUserEntryPoint [as runMain](internal/modules/run_main.js:76:12)at internal/main/run_main_module.js:17:47 { code:'MODULE_NOT_FOUND',requireStack:[] }
我该如何解决这个问题?

My Dockerfile:

FROM node:14
 
WORKDIR /app
 
COPY package.json .
 
RUN npm install 
 
COPY . .
 
EXPOSE 80
 
# VOLUME ["/app/feedback"]
 
CMD ["node", "server.js"]

ruarlubt

ruarlubt1#

绑定-v "/WorkSpace/d/data-volumes-03-adj-node-code:/app"破坏了一切!它将主机目录中的内容挂载到容器的/app路径上,因此在构建docker镜像期间安装的所有模块都将丢失。
我们能做些什么呢?在其他地方安装节点模块并更改其默认节点路径。所以你的Dockerfile变成了(删除了COPY . .,因为你想在容器上绑定挂载你的项目文件,所以这是不必要的):

FROM node:14
 
WORKDIR /modules
 
COPY package.json .
 
RUN npm install 

ENV NODE_PATH=/modules/node_modules
 
EXPOSE 80

WORKDIR /app
 
CMD ["node", "server.js"]

运行你的docker镜像:

docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback -v "/c/WorkSpace/d/data-volumes-03-adj-node-code:/app" -v /modules/node_modules feedback-node:volumes
yzckvree

yzckvree2#

问题是您没有在-v "/WorkSpace/d/data-volumes-03-adj-node-code:/app"中指定项目目录的完整路径。
您应该执行-v "c:/WorkSpace/d/data-volumes-03-adj-node-code:/app"

ttisahbt

ttisahbt3#

绑定mount share或挂载host目录到Docker容器。
在容器内部,可以访问正在装载的主机目录的所有内容。
使用bind mount时,我们通常只在docker镜像中安装依赖项,因为所有代码都可以从mount路径访问。
例如dockerfile

FROM node:slim
WORKDIR /app
COPY package*.json ./
RUN apt-get update
RUN npm install
EXPOSE 1337
CMD ["npm", "start"]

package.json

{
  "name": "nodemon-docker-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start:express": "node ./index.js",
    "start": "nodemon"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {
    "nodemon": "^1.19.2"
  }
}

因此,对于热重新加载,也可以使用nodemon
不要直接将整个文件夹移动到容器中,因为可能会覆盖依赖项。

docker run -d -p 1337:1337 --name nodemon-app -v host_folder_path:/container path nodemon-node:v1.0

或者

docker run --rm -it -p 1337:1337 -v "${PWD}/server:/usr/src/app/server" nodemon-node:v1.0

也有同样的好文章:https://www.freecodecamp.org/news/how-to-enable-live-reload-on-docker-based-applications/

6tqwzwtp

6tqwzwtp4#

您应该运行以下命令:

docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback -v "$(pwd):/app" -v /app/node_modules feedback-node:volumes

Reference

ffscu2ro

ffscu2ro5#

绑定挂载是将主机目录(在我们的例子中是windows)共享或挂载到Docker容器。
在容器目录中,您正在挂载的主机目录的所有内容都将是可访问的和异步的(读写),您可以编辑主机上的任何文件,所有更改都将影响容器目录或文件。
要实现这一点,你的Dckerfile应该看起来像这样:

FROM node:14

WORKDIR /app
# copy everything from the host app directory to the current directory on the container (/app)
COPY package*.json . 

RUN npm install

COPY . .

EXPOSE 80

CMD [ "npm", "start" ]

在您的package.json

{
  "name": "data-volume-example",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "author": "O.Abdelaaziz",
  "license": "ISC",
  "scripts": {
    "start": "nodemon server.js"
  },
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1"
  },
  "devDependencies": {
    "nodemon": "2.0.4"
  }
}

现在重要的是命令,如何编写一个没有错误的命令,并避免任何错误,如:
docker:来自守护进程的错误响应:创建装载源路径'/run/desktop/mnt/host/c/Users/amine/Desktop/data-volumes'时出错:mkdir /run/desktop/mnt/host/c:文件存在。
或者一些错误,当你认为你运行你的容器没有错误,但你惊讶于一个停止的容器后,列出运行/停止的容器。

docker ps -a 

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
c31d3bd8204a   102       "docker-entrypoint.s…"   52 seconds ago   Exited (254) 49 seconds ago             node_data_volumes_container

通过记录集装箱

docker logs c31d3bd8204a

npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /app/package.json
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/app/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

在绑定挂载卷中,我们确实知道文件夹存储在哪里,因为我们作为开发人员设置了容器的内部路径应该Map到我们的主机上的路径,这里是诀窍。
怎么写?看看这个链接
Mounting Docker volumes with Docker Toolbox for Windows
命令应该如下所示

docker run -d --name node_data_volumes_container -p 3000:80 -v feedback:/app/feedback -v "/C/Users/amine/Desktop/data-volumes/:/app" -v /app/node_modules b52

-d以分离模式运行容器
--name给予容器命名
-p端口从主机上的(3000)转发到容器上的(80)
-v feedback:/app/feedback命名卷,即使我们停止容器也保留所有文件
-v“/C/Users/amine/Desktop/data-volumes/:/app”bind将主机目录挂载到容器目录
-v /app/node_modules在我们停止容器后保持/查找依赖的匿名卷
b52图像ID的前3个字母(您可以给予完整的ID/名称)
我希望你们能明白。

相关问题