我有一个Docker容器,它运行一些代码并创建一些HTML报告。我希望将这些报告发布到主机上的特定目录中,即/usr/share/nginx/reports
我这样做的方法是将此主机目录挂载为数据卷,即docker run -v /usr/share/nginx/reports --name my-container com.containers/my-container
但是,当我进入主机并检查目录/usr/share/nginx/reports
的内容时,我没有看到任何报告数据。
我做错了吗?
主机是Ubuntu服务器,Docker容器也是Ubuntu,这里没有boot2docker的怪异。
答案 0 :(得分:27)
从" Managing data in containers",将主机文件夹挂载到容器将是:
docker run -v /Users/<path>:/<container path>
(参见&#34; Use volume&#34;)
仅使用-v /usr/share/nginx/reports
会将内部容器路径/usr/share/nginx/reports
声明为卷,但与主机文件夹无关。
这是可用的安装类型之一:
答案 1 :(得分:9)
这个问题的答案是有问题的,因为它因您的操作系统和您的全部要求而异。 answer by VonC 做出了一些应该解决的假设,因此仅在某些上下文中是正确的。关于这个主题的其他答案通常忽略了这样一个事实,即有些人在运行 linux,有些人在 windows,还有一些人在 OSX 或其他奇怪的操作系统上。
正如 VonC 在他的回答中提到的,在很多情况下,可以使用 docker 命令的 -v host-path:container-path
参数将主机目录直接绑定挂载到容器中(您也可以使用 {{1 }} 增加可读性或 --mount 用于火箭科学)。
最大的问题之一(2020 年)是使用适用于 Linux 的 Windows 子系统 (WSL),其中绑定安装主机卷充满错误,可能会或可能不会按预期工作,具体取决于路径是否安装在 linux 文件系统或 windows 文件系统中。 VonC 的回答是在 WSL 成为大问题之前写的,但它仍然假设本地文件系统是真实的,而不是安装到某种虚拟机中。
我发现很多工程师更喜欢通过使用 docker volumes 来绕过这种不必要的混淆。可以使用以下命令创建 docker 卷:
--volume
列出
docker volume create <name>
并用
删除docker volume ls
您可以通过在 --volume 参数的左侧指定卷的名称来安装它。例如,如果您的卷被称为“日志”,您可以使用类似 docker volume rm <name>
的内容将其绑定到您感兴趣的日志目录。您可以使用以下内容查看目录的内容:< /p>
--volume logs:/usr/share/nginx/reports
这应该列出该目录中的文件。例如,如果您有一个名为“nginx.log”的文件,您可以这样查看它:
docker run -it --rm --volume logs:/logs alpine ls -AlF /logs/
内容将被分页到您的终端。
如果需要,您可以同时将此卷绑定到多个容器。例如,如果您使用一个容器写入日志,然后使用另一个容器将它们分页到控制台,这将非常有用。
如果您想将上面的示例日志文件复制到本地文件系统上的 tmp 目录中,您可以通过以下方式实现:
docker run -it --rm --volume logs:/logs alpine less /logs/nginx.log
答案 2 :(得分:3)
我在Windows上使用Docker工具箱。我正在使用Docker处理Spring Boot应用程序。我的应用程序将日志写入
users/path/service.log
因此,当我从主机终端启动应用程序时,日志文件已成功更新。 但是当我在docker上做的时候,没有创建任何文件,也没有更新。
所以我更改了我的日志文件位置以匹配Container的目录
var/log/service.log
我再次启动了我的容器,我的文件又被更新了。
只要与容器目录匹配,您就可以选择任何位置。只需冲进容器,看看有什么适合你。
下一步是将日志文件从容器复制到主机。
因此,要将这些日志复制到您的主机。您可以使用我所知道的两种方式之一 -
1-在docker中使用卷
2-使用Docker命令将文件从docker容器复制到主机 - :
docker cp <containerId>:/file/path/within/container /host/path/target
答案 3 :(得分:-2)
在您的应用程序中,如果您为 php 代码设置了工作目录(报告路径),则该路径必须是容器上的路径。然后docker会自动copy到你的host目录下。这不是 docker 配置错误,而是我的应用程序写入错误的地方。一开始很奇怪,但在我的情况下确实有效。