gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:17:33 24 4
gpt4 key购买 nike

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

我想将elasticsearch数据存储在主机而不是容器上。根据 docker-elk 的自述文件,我在 docker-compose.ymlelasticsearch 部分添加了 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 ...

查看../../envelasticsearch目录确实已创建,但它是空的。如果我创建 ../../env/elasticsearch/elasticsearch ,那么我会收到 /usr/share/elasticsearch/data/elasticsearch/nodes 的访问错误。如果我创建 /nodes 然后我会收到 /nodes/0 等错误...

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

如何让它具有写权限?我尝试了 chmod a+wx ../../env/elasticsearch,然后它设法创建下一个目录,但该目录具有权限 drwxr-xr-x然后它又卡住了。

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

最佳答案

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时,它应该使用您的更改构建一个elasticsearch容器。

(我曾经不得不做这样的事情 with apache for Magento 。)

关于macos - 如何挂载容器可写的主机目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35880760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com