Docker 卷不保留数据

Docker volumes not keeping data

我已经构建了一个 docker 图像,其中包含一个 python 脚本,该脚本使用两个不同的命令。第一个创建一个文件,在执行第二个时使用。

据我所知,我必须使用 Docker 卷来存储执行之间的数据,因此我创建了一个卷:

docker volume create myvol

然后在运行容器

时使用它
$ docker run myimg fit -v myvol:/data
model.h5 stored at /data

但是,当执行其他命令时,Docker 目录 /data 似乎是空的...

$ docker run predict -v myvol:/data
Error: /data/model.h5 not found

我有什么遗漏的地方吗?

确保在 Docker 运行 命令中使用 -v 或 --mount 参数。这将确保数据真正存储在容器之外,并且您不会丢失任何东西。 请参阅:https://docs.docker.com/storage/volumes/ 了解详细信息。

docker 命令行是顺序敏感的。语法是:

docker $args_to_docker run $args_to_run $image_name $override_to_cmd

在您的命令中,您在图像名称后传递 -v 选项,因此它成为容器中的 CMD 值:

$ docker run myimg fit -v myvol:/data
model.h5 stored at /data

在容器内运行 cmd fit -v myvol:/data


如果您希望 -v 成为 run 的选项并定义一个卷,解决方案是更改顺序:

$ docker run -v myvol:/data myimg fit 
$ docker run -v myvol:/data predict 

当运行这些命令时你需要记住-v选项的第一部分总是<path_to_directory_on_host>:<path_to_directory_on_guest>。您可以使用主机上目录的绝对路径和相对路径。所以第一件事是在你的主机上创建一个名为 data 的目录,将 model.h5 移动到该目录中,然后使用 -v 开关挂载它。

因此,如果我的数据目录位于 windows 目录中的 C:\data 中,我将使用:

docker run <img_name> -v C:\data:/data

如果我在 unix 上并且我的数据目录在 /usr/data 中并且我希望它挂载在我的来宾容器中的 /data 上,那么我会使用

docker run <img_name> -v /usr/data:/data