如何装载容器可写主机目录?

我试图运行一个使用Docker的ELK栈。 我发现docker-elk已经使用docker-compose为我build立了configuration。

我想将弹性search数据存储在主机而不是容器上。 根据docker-elk的README,我在docker-compose.yml的部分添加了一个volumes行:

 elasticsearch: image: elasticsearch:latest command: elasticsearch -Des.network.host=0.0.0.0 ports: - "9200" - "9300" volumes: - ../../env/elasticsearch:/usr/share/elasticsearch/data 

但是,当我运行docker-compose up我得到:

 $ docker-compose up Starting dev_elasticsearch_1 Starting dev_logstash_1 Starting dev_kibana_1 Attaching to dev_elasticsearch_1, dev_logstash_1, dev_kibana_1 kibana_1 | Stalling for Elasticsearch elasticsearch_1 | [2016-03-09 00:23:35,193][WARN ][bootstrap ] unable to install syscall filter: seccomp unavailable: your kernel is buggy and you should upgrade elasticsearch_1 | Exception in thread "main" java.lang.IllegalStateException: Unable to access 'path.data' (/usr/share/elasticsearch/data/elasticsearch) elasticsearch_1 | Likely root cause: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/elasticsearch elasticsearch_1 | at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) elasticsearch_1 | at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ... etc ... 

查看../../env目录确实是创build的,但是是空的。 如果我创build../../env/elasticsearch/elasticsearch然后我得到/usr/share/elasticsearch/data/elasticsearch/nodes的访问错误。 如果我创build/nodes那么我得到/nodes/0等错误…

简而言之,容器似乎没有对目录的写权限。

我如何获得它的写权限? 我尝试了chmod a+wx ../../env/elasticsearch ,然后设法创build下一个目录,但该目录具有许可权drwxr-xr-x并且又被卡住了。

我不喜欢以root身份运行它的想法。

Docker不会在基本映像中担心这些事情,因为它期望您使用卷或容器容器。 安装到主机获得二级支持。 但是,只要拥有该目录的UID不是零(它看起来不是基于我们的评论交换),您应该能够以已经拥有该目录的用户的身份运行elasticsearch。 您可以尝试从容器中删除并重新添加elasticsearch用户,并指定其UID。

您需要在入口点时间这样做,所以你最好的select是build立一个自定义的容器。 用这些内容创build一个名为my-entrypoint的文件:

 #!/bin/bash # Allow running arbitrary one-off commands [[ $1 && $1 != elasticsearch ]] && exec "$@" # Otherwise, fix perms and then delegate the rest to vanilla target_uid=$(stat -c %u /usr/share/elasticsearch/data) userdel elasticsearch useradd -u "$target_uid" elasticsearch . /docker-entrypoint "$@" 

确保它是可执行的。 然后用这些内容创build一个Dockerfile:

 FROM elasticsearch COPY my-entrypoint / ENTRYPOINT ["/my-entrypoint"] 

最后更新你的docker-compose.yml文件:

 elasticsearch: build: . command: elasticsearch -Des.network.host=0.0.0.0 ports: - "9200" - "9300" volumes: - ../../env/elasticsearch:/usr/share/elasticsearch/data 

现在,当您运行docker-compose up它应该使用您的更改构build一个elasticsearch容器。

(我必须用apache来做这样的事情。