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

时间:2016-03-09 00:31:39

标签: macos docker file-permissions docker-compose docker-toolbox

我正在尝试使用Docker运行ELK堆栈。我发现docker-elk已使用docker-compose为我设置了配置。

我想将elasticsearch数据存储在主机而不是容器中。根据docker-elk的自述文件,我在volumes的{​​{1}}部分添加了elasticsearch行:

docker-compose.yml

但是,当我运行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目录,但它是空的。如果我创建了elasticsearch,那么我会收到../../env/elasticsearch/elasticsearch的访问错误。如果我创建了/usr/share/elasticsearch/data/elasticsearch/nodes,那么我会收到/nodes等错误...

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

如何让它具有写入权限?我尝试了/nodes/0,然后设法创建了下一个目录,但该目录具有权限chmod a+wx ../../env/elasticsearch并且再次卡住了。

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

1 个答案:

答案 0 :(得分:2)

Docker不会在基础映像中担心这些问题,因为它希望您使用卷或容量容器。挂载到主机获得第二类支持。但只要拥有该目录的UID不为零(并且它似乎不是基于我们的评论交换),您应该能够以已拥有该目录的用户身份运行elasticsearch。您可以尝试从容器中删除并重新添加elasticsearch用户,并指定其UID。

您需要在入口时执行此操作,因此最好的办法是构建自定义容器。使用以下内容创建名为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 "$@"

确保它是可执行的。然后使用以下内容创建一个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时,它应该根据您的更改构建一个弹性搜索容器。

(我必须在with apache for Magento之后做这样的事情。)