首页 > 解决方案 > 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

标签: node.jsdocker

解决方案


几个潜在的问题:

  1. 如果您使用的是 docker 桌面,则需要确保您的目录是共享的,因为 docker 引擎实际上是在虚拟机上运行的,/tmp 可能不等同于您机器上的 /tmp。

On macOS: Docker -> Preferences -> Resources -> FILE SHARING

  1. 您还需要小心坐骑。当您像上面那样运行带有“-v”选项的容器时,它会绑定安装容器内的主机目录。如果您在“/app”目录之上绑定挂载一个目录,您将看不到绑定挂载之前 /app 中的内容。您应该选择一个空的或不存在的目录来执行绑定挂载。

  2. 当您在 Dockerfile 中运行“COPY”时,即从构建上下文中永久复制资产,并在容器内静态复制。如果您需要动态资产,请跳过该步骤,并在运行时进行绑定挂载。


推荐阅读