如何解决如何在其映像中具有“WORKDIR /app”的容器上使用 node.js 来访问共享卷volumes_from?
我有 2 个容器,第一个(“客户端”)将文件写入卷,而第二个(“服务器”)需要读取它们(这是我要求的简化版本)。我的问题是,当使用 WORKDIR /app
设置时,我不知道如何使用 node.js 从第二个容器访问文件。
(我已经看到了如何使用 volumes_from
访问卷的示例,例如:https://phoenixnap.com/kb/how-to-share-data-between-docker-containers 可在我的测试中使用,但未演示我的设置)
这是我的 docker-compose 文件(简化版):
volumes:
aca_storage:
services:
server-test:
image: aca-server:0.0.1
container_name: aca-server-test
command: sh -c "npm install && npm run start:dev"
ports:
- 8080:8080
volumes_from:
- client-test:ro
environment:
NODE_ENV: development
client-test:
image: aca-client:0.0.1
container_name: aca-client-test
ports:
- 81:80
volumes:
- aca_storage:/app/files_to_share
这是 aca-server 镜像的 docker 文件:
FROM node:alpine
WORKDIR /app
COPY ["./package*.json","./"]
RUN npm install -g nodemon
RUN npm install --production
COPY . .
CMD [ "node","main.js"]
在我服务器的节点应用程序上,我试图读取这样的文件:
fs.readdir(PATH_TO_SHARED_VOLUME,function (err,files) {
if (err) {
return console.log('Unable to scan directory: ' + err);
}
files.forEach(function (file) {
console.log(file);
});
});
但是我用有效路径填充 PATH_TO_SHARED_VOLUME 的所有测试都失败了。例如:
- /aca_storage
- /aca_storage/_data
- /acaproject_aca_storage
- /acaproject_aca_storage/_data
(acaproject 是我注意到自动添加的 VS Code 工作区名称)
在“aca-server-test”容器上使用 docker cli,我得到:
/app #
使用 ls 仅公开我的 node.js 应用程序上的文件/文件夹,但不允许访问卷“aca_storage”,就像我在互联网上可以找到的示例一样。
如果相关,我的环境是:
- 带有 WSL2 的 Windows 10 家庭版
- Docker 桌面设置为 Linux 容器
我对 Linux 和 Docker 一窍不通,所以尽可能多的细节将不胜感激。
解决方法
您可以将相同的存储挂载到不同路径上的不同容器中。我会避免使用 volumes_from:
,它不灵活且有点不透明。
version: '3.8'
volumes:
aca_storage:
services:
client:
volumes:
- aca_storage:/app/data
server:
volumes:
- aca_storage:/app/files_to_share
在每个容器中,挂载路径需要与应用程序代码期望的匹配,但它们不一定需要是相同的路径。使用此配置,例如在服务器代码中,您可以设置 PATH_TO_SHARED_VOLUME = '/app/files_to_share'
。
如果 VSCode 添加绑定挂载以使用本地开发代码替换服务器映像的 /app
目录,volumes_from:
也会将此挂载复制到客户端容器中。这可能会导致奇怪的行为。
在容器之间共享文件会增加许多复杂性;这使得扩展设置并将其移动到集群设置(如 Docker Swarm 或 Kubernetes)变得困难。一种更简单的方法是客户端容器将数据通过 HTTP POST 发送到服务器容器,然后服务器容器可以管理自己的(非共享)存储。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。