如何将主机目录挂载到 运行 docker 容器中

How to mount a host directory into a running docker container

我想将我的 USB 驱动器装入 运行 docker 实例以手动备份一些文件。

我知道 docker run-v 功能,但这会创建一个新容器。 注意:它是一个 nextcloudpi 容器。

您只能在容器启动后更改 a very limited set of container options。环境变量和容器安装等选项只能在初始 docker rundocker create 期间设置。如果你想改变这些,你需要停止并删除你现有的容器,然后用新的挂载选项创建一个新的。

如果有您认为需要保留或备份的数据,无论如何它都应该存在于某种卷安装中。删除并重新启动您的容器,并使用 -v 选项在保存数据的位置安装一个卷。 Docker 文档有一个使用 named volumes with separate backup and restore containers 的示例;或者您可以直接使用主机目录和那里的常规备份解决方案。 (按照我在第一段中的建议删除和重新创建一个容器是非常常规的,这不应该涉及明确的 "backup" 和 "restore" 步骤。)

如果您的数据现在就在那里,您不能丢失,您可以 docker cp 在设置更强大的存储方案之前将其从容器中取出。

我知道这个问题来自 May,但对于未来的搜索者:

在主机文件系统上创建挂载点:

sudo mkdir /mnt/usb-drive

运行 docker 容器使用 --mount 选项并将 "bind propagation" 设置为 "shared":

docker run --name mynextcloudpi -it --mount type=bind,source=/mnt/usb-drive,target=/mnt/disk,bind-propagation=shared nextcloudpi

现在您可以将 USB 驱动器安装到 /mnt/usb-drive 目录,它将安装到 运行 容器内的 /mnt/disk 位置。

例如:sudo mount /dev/sda1 /mnt/usb-drive

当然要改/dev/sda1。

关于绑定传播的更多信息:https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation

所述,使用普通 docker 命令几乎不可能更改现有容器的卷位置。

我找到了适合我的替代方法。 主要思想是将现有容器转换为新的 docker 图像并在其上初始化一个新的 docker 容器。希望对你也有用。

# Create a new image from the container
docker commit CONTAINERID NEWIMAGENAME

# Create a new container on the top of the new image
docker run -v HOSTLOCATION:CONTAINERLOCATION NEWIMAGENAME