Docker中的Logstash – 通过卷挂载时找不到configuration文件

编辑:这似乎是一个boot2docker的东西…工作正常在Ubuntu的VM运行docker。

我试图在Docker容器中启动logstash,但是当我将configuration文件挂载为卷时,似乎没有find它。 有趣的是,如果我用bash启动容器,我可以在那里看到configuration文件,并运行与docker相同的命令。

Docker文件

FROM ubuntu:14.04 MAINTAINER cvallance RUN apt-get update RUN apt-get -yqq install openjdk-7-jre RUN apt-get -yqq install curl RUN mkdir /opt/logstash \ && cd /opt/logstash \ && curl -O https://download.elastic.co/logstash/logstash/logstash-1.4.2.tar.gz \ && tar zxvf logstash-1.4.2.tar.gz CMD ["/opt/logstash/logstash-1.4.2/bin/logstash", "agent", "--verbose", "-f", "/etc/logstash/sample.conf"] 

configuration文件位于$(pwd)/config/sample.conf

 input { stdin { } } output { stdout { codec => rubydebug } } 

Docker构build命令:

 docker build -t cvallance/logstash . 

Docker运行命令:

 docker run -ti -v $(pwd)/config:/etc/logstash cvallance/logstash 

错误:

 Error: No config files found: /etc/logstash/sample.conf Can you make sure this path is a logstash config file? 

但是,如果我从一个bash会话的容器内运行相同的命令像这样…

 docker run -ti -v $(pwd)/config:/etc/logstash cvallance/logstash bash ... root@d3fd885903dd:/# /opt/logstash/logstash-1.4.2/bin/logstash agent --verbose -f /etc/logstash/sample.conf 

一切都按预期工作。 即input和输出

 testing { "message" => "testing", "@version" => "1", "@timestamp" => "2015-04-10T00:06:33.878Z", "host" => "d3fd885903dd" } 

如果它是一个“boot2docker”的东西,请记住,它提供了一个基于Tiny核心的Linux主机, 没有任何持久性/var/lib/docker除外)。

我所做的是确保已安装Oracle_VM_VirtualBox_Extension_Pack ,并在我的boot2docker ssh会话中自动共享my /c/Users/<yourLogin>
不管我需要保留什么,都写在那里( /c/Users/<yourLogin>/... ),而不是其他地方。
如果必须将主机目录挂载为数据卷,则应从/c/Users/<yourLogin>/...挂载文件夹。

另一个选项(持续存在)是定义一个数据卷容器 ,该容器将数据保存在/var/lib/docker/volumes/conf.json ,(对于实际文件)保存在/var/lib/docker/vfs/xxx
这是首选的最佳做法,因为它不会将您的数据容器链接到特定的主机平台(在Windows上,“ /c/Users/<yourLogin>实际上取决于VM主机!