如何装载容器可写主机目录?
我试图运行一个使用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来做这样的事情。