Docker卷不保留数据

时间:2019-01-27 11:11:27

标签: docker docker-volume

我已经用Python脚本构建了一个docker镜像,该脚本可以使用两个不同的命令。第一个创建一个在执行第二个时使用的文件。

据我所知,我必须使用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

我有什么想念的地方吗?

3 个答案:

答案 0 :(得分:3)

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 

答案 1 :(得分:0)

确保对Docker run命令使用-v或--mount参数。这将确保数据确实存储在容器外部,并且不会丢失任何内容。 有关详细信息,请参见:https://docs.docker.com/storage/volumes/

答案 2 :(得分:0)

运行这些命令时,需要记住-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