如何从Docker容器向托管文件系统写入数据

jcm*_*jcm 39 docker

我有一个Docker容器,它运行一些代码并创建一些HTML报告.我希望将这些报告发布到主机上的特定目录中,即在/usr/share/nginx/reports

我这样做的方法是将这个主机目录挂载为数据卷,即 docker run -v /usr/share/nginx/reports --name my-container com.containers/my-container

但是,当我ssh到主机,并检查目录的内容时/usr/share/nginx/reports,我没有看到任何报告数据.

难道我做错了什么?

主机是一个Ubuntu服务器,Docker容器也是Ubuntu,这里没有boot2docker怪异.

Von*_*onC 30

从" 管理容器中的数据 ",将主机文件夹安装到容器将是:

docker run -v /Users/<path>:/<container path>
Run Code Online (Sandbox Code Playgroud)

(参见" 使用量 ")

仅使用-v /usr/share/nginx/reports会将内部容器路径声明/usr/share/nginx/reports为卷,但与主机文件夹无关.

这是可用的安装类型之一:

https://docs.docker.com/storage/images/types-of-mounts.png

  • @Neel您正在将主机路径“/var/log/iogfoldername”安装到容器路径“/Logs”:容器执行创建的“var/log”文件夹与该安装无关。 (2认同)

Eng*_*ery 10

这个问题的答案是有问题的,因为它因您的操作系统和您的全部要求而异。VonC回答做出了一些应该解决的假设,因此仅在某些情况下才是正确的。关于这个主题的其他答案通常忽略了这样一个事实,即有些人在运行 linux,有些人在 windows,还有一些人在 OSX 或其他奇怪的操作系统上。

正如 VonC 在他的回答中提到的,在很多情况下,-v host-path:container-path可以使用--volumedocker命令的参数将主机目录直接绑定安装到容器中(您也可以使用增加可读性或 --mount 用于火箭科学)。

最大的问题之一(2020 年)是使用适用于 Linux 的 Windows 子系统 (WSL),其中绑定安装主机卷充满错误,并且可能会或可能不会按预期工作,具体取决于安装的路径是否在linux 文件系统或 windows 文件系统。VonC 的回答是在 WSL 成为大问题之前写的,但它仍然假设本地文件系统是真实的,而不是安装到某种虚拟机中。

我发现很多工程师更喜欢通过使用docker volumes来绕过这种不必要的混淆。可以使用以下命令创建 docker 卷:

docker volume create <name>
Run Code Online (Sandbox Code Playgroud)

上市

docker volume ls
Run Code Online (Sandbox Code Playgroud)

并删除

docker volume rm <name>
Run Code Online (Sandbox Code Playgroud)

您可以通过在 --volume 参数的左侧指定卷的名称来安装它。例如,如果您的卷被称为“日志”,您可以使用类似的--volume logs:/usr/share/nginx/reports方法将其绑定到您感兴趣的日志目录。您可以使用以下内容查看目录的内容:

docker run -it --rm --volume logs:/logs alpine ls -AlF /logs/
Run Code Online (Sandbox Code Playgroud)

这应该列出该目录中的文件。例如,如果您有一个名为“nginx.log”的文件,您可以这样查看它:

docker run -it --rm --volume logs:/logs alpine less /logs/nginx.log
Run Code Online (Sandbox Code Playgroud)

并且内容将被分页到您的终端。

如果需要,您可以同时将此卷绑定到多个容器。例如,如果您使用一个容器写入日志,并使用另一个容器将它们分页到控制台,这将非常有用。

如果您想将上面的示例日志文件复制到本地文件系统上的 tmp 目录中,您可以通过以下方式实现:

docker run -it --rm --volume logs:/logs --volume /tmp:/local_tmp alpine cp /logs/nginx.log /local_tmp/
Run Code Online (Sandbox Code Playgroud)

  • 对我 2015 年的旧答案进行了很好的更新。已投赞成票。 (2认同)

小智 5

我在 Windows 上使用 Docker 工具箱。我正在使用 Docker 开发 Spring Boot 应用程序。我的应用程序将日志写入

users/path/service.log 
Run Code Online (Sandbox Code Playgroud)

因此,当我从主机终端启动应用程序时,日志文件已成功更新。但与我在 docker 上执行的操作相同,没有创建文件,也没有更新文件。

所以我更改了日志文件位置以与容器的目录相匹配

var/log/service.log
Run Code Online (Sandbox Code Playgroud)

我再次启动我的容器,我的文件再次更新。

您可以选择任何位置,只要与容器目录匹配即可。只需猛击容器,看看什么适合你。

下一步是将日志文件从容器复制到主机。

因此,为了将这些日志复制到您的主机。您可以使用我知道的两种方法之一-

1-在docker中使用

2-使用以下 Docker 命令将文件从 docker 容器复制到主机:

docker cp <containerId>:/file/path/within/container /host/path/target
Run Code Online (Sandbox Code Playgroud)