node.js - Docker如何将文件从容器复制到主机?
问题描述
我面临着需要与容器共享主机上文件夹中的数据。在容器内创建的数据应该在主机上读取或修改,反之亦然。
我决定为此使用 Docker Run -v arg。我受到这个项目的启发。https://github.com/itzg/docker-minecraft-server。那里实施了我向您描述的相同原则。
docker run -d -v /path/on/host:/data \
-e TYPE=PAPER -e FORCE_REDOWNLOAD=true \
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
所有数据都将在/path/on/host
. 可以在主机上修改文件,所有更改都将传输到容器,反之亦然。和文件夹不断链接/path/on/host
。/data
因此,我决定在我的项目中执行此操作 - 一个 nodejs 机器人。但没有任何结果,因为文件不会从容器复制到主机。文件的访问权只能从宿主机到容器。现在我想知道如何将文件从容器复制到主机。
我该如何做与上面的示例相同的操作,或者如何以不同的方式实现它,以便在一行中从终端方便地启动共享文件夹中的实例?
其他指南没有帮助我。我想完全使用-v。
WORKDIR 中的文件将被创建
docker run --name app node-app
WORKDIR 将为空或包含 /tmp/node-app 中的任何文件
docker run -v /tmp/node-app:/app --name app node-app
Dockerfile
FROM node:lts
VOLUME /app/
COPY ./repo/package.json /app/package.json
WORKDIR /app/
RUN npm install --production
COPY ./repo /app/
CMD npm start
解决方案
几个潜在的问题:
- 如果您使用的是 docker 桌面,则需要确保您的目录是共享的,因为 docker 引擎实际上是在虚拟机上运行的,/tmp 可能不等同于您机器上的 /tmp。
On macOS: Docker -> Preferences -> Resources -> FILE SHARING
您还需要小心坐骑。当您像上面那样运行带有“-v”选项的容器时,它会绑定安装容器内的主机目录。如果您在“/app”目录之上绑定挂载一个目录,您将看不到绑定挂载之前 /app 中的内容。您应该选择一个空的或不存在的目录来执行绑定挂载。
当您在 Dockerfile 中运行“COPY”时,即从构建上下文中永久复制资产,并在容器内静态复制。如果您需要动态资产,请跳过该步骤,并在运行时进行绑定挂载。
推荐阅读
- angular - 我们如何使用 *ngFor loop angular 5 创建多个动态下拉列表
- python - 是否想使用 python 在 zip 中查找重复值
- ubuntu-16.04 - /home/user/.Private 100% 磁盘使用率?
- c# - 例如 2020-06-26T21:04:18.1823633Z 的日期格式是什么?
- php - 未捕获的 SoapFault 异常:[Client] Function ("getUserLists") AdWords API
- sqlite - 使用 Azure 移动应用程序客户端 sdk 在 SQL Lite 中定义外键
- r - chol.default(Cxx) 中的错误:顺序的主要次要不是正定的
- javascript - React JS - 渲染表格时出现错误无法读取未定义的属性“地图”
- c++ - 未能找到存在于 std::wstring 中的 wchar_t
- myob - 使用 C# 在 MyOB 帐户中使用 API 创建采购订单