我正在编写一个cli,该cli将在完成时生成一个markdown文件,并为该cli构建一个docker映像。
我想将容器生成的markdown文件挂载到主机上。
docker -v将在主机上不存在路径时自动创建文件夹而不是文件。
例如。 〜/ result.md最初不存在。
docker run -it --rm -v ~/result.md:/usr/src/work_dir/result.md cli:latest generate_markdown
运行后,将创建~/result.md
文件夹而不是文件,并且cli由于写入目录而不是文件而抛出异常。
为避免这种情况,我必须首先创建一个文件,然后再运行docker cli。工作正常。 是否可以避免在开始时创建文件?
答案 0 :(得分:0)
卷挂载将采用传入的目录名,而不是文件名。您可以挂载卷~
或创建目录并挂载该卷。
mkdir ~/markdown
docker run -it --rm -v ~/markdown/:/usr/src/work_dir/ cli:latest generate_markdown
答案 1 :(得分:0)
您应避免按照最佳做法将文件一起装入。话虽如此,您无法更改您描述的x故障行为。
解决您的问题(不要在运行容器之前每次都创建文件)的方法是挂载目录,省略文件名。
docker run -it --rm -v ~/:/usr/src/work_dir/ cli:latest generate_markdown
答案 2 :(得分:0)
尝试-
$docker volume create myvol
$docker run -it --rm -v myvol:/usr/src/work_dir/ cli:latest generate_markdown
或者,您可以
$docker run -it --rm -v myvol:/usr/src/work_dir/ cli:latest generate_markdown
想要解释吗?
您正在使用绑定安装;根据您的情况
docker run -it --rm -v ~/result.md:/usr/src/work_dir/result.md cli:latest generate_markdown
解决问题的方法可能只是卷装载。 有关更多信息,请参考-https://docs.docker.com/storage/volumes/
首先创建Docker卷,方法是-
$docker volume create myvol
。您可以使用任何名称代替myvol。
将创建此docker卷,您可以检查该卷是否成功创建,由-
$docker volume ls
这将列出所有卷,应该列出新创建的卷。
ak@ubuntu:~$ docker volume create myvol
myvol
ak@ubuntu:~$ docker volume ls
DRIVER VOLUME NAME
local myvol
Docker卷存储在主机文件系统上的单独区域中,并且完全由docker管理,而不是绑定安装.Docker卷将状态存储在容器之外,因此当您替换容器进行更新时,数据仍然存在您的应用。
如果您指定名称而不是目录路径,也会自动创建Docker卷。在下面的示例中,将自动创建名为myvol2的卷-
$docker run -it -v myvol2:/home/myfiles imagename:tag
Docker卷通常在/var/lib/docker/volumes
中创建
在Linux和Windows的C:\ProgramData\docker\volumes
中。
现在这是有用的部分。指定容器目录中已存在的所有数据/文件/目录都会自动复制或“挂载”到docker卷上。因此,如果上例中提到的'''/ usr / src / work_dir /'''目录包含任何文件(例如您的情况下的标记文件),它们将自动复制到该卷上。
希望这会有所帮助。