从容器挂载主机文件时如何自动创建文件而不是目录

时间:2019-06-15 03:16:41

标签: docker

我正在编写一个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。工作正常。 是否可以避免在开始时创建文件?

3 个答案:

答案 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 /'''目录包含任何文件(例如您的情况下的标记文件),它们将自动复制到该卷上。

希望这会有所帮助。