运行容器时权限被拒绝(docker 1.12.5)

运行容器时权限被拒绝(docker 1.12.5),docker,Docker,我试图在安装了Docker 1.12.5的新创建的VM上运行ElasticSearch容器,但遇到了权限被拒绝异常。让我困惑的是,在我的旧虚拟机中,Docker 1.12.2运行得很好。我错过了什么 例外情况: Exception in thread "main" SettingsException[Failed to open stream for url [/usr/share/elasticsearch/config/elasticsearch.yml]]; nested: AccessD

我试图在安装了Docker 1.12.5的新创建的VM上运行ElasticSearch容器,但遇到了
权限被拒绝
异常。让我困惑的是,在我的旧虚拟机中,Docker 1.12.2运行得很好。我错过了什么

例外情况

Exception in thread "main" SettingsException[Failed to open stream for url [/usr/share/elasticsearch/config/elasticsearch.yml]]; nested: AccessDeniedException[/usr/share/elasticsearch/config/elasticsearch.yml];
Likely root cause: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/config/elasticsearch.yml
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
    at java.nio.file.Files.newByteChannel(Files.java:361)
    at java.nio.file.Files.newByteChannel(Files.java:407)
    at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
    at java.nio.file.Files.newInputStream(Files.java:152)
    at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067)
    at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88)
    at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:107)
    at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:100)
    at org.elasticsearch.bootstrap.BootstrapCLIParser.<init>(BootstrapCLIParser.java:48)
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:242)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
FROM openjdk:8-jre

ENV VERSION 2.4.1

RUN groupadd -r elasticsearch && useradd -r -g elasticsearch elasticsearch
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 46095ACC8548582C1A2699A9D27D666CD88E42B4
RUN set -x \
    && apt-get update && apt-get install -y --no-install-recommends apt-transport-https && rm -rf /var/lib/apt/lists/* \
    && echo 'deb http://packages.elasticsearch.org/elasticsearch/2.x/debian stable main' > /etc/apt/sources.list.d/elasticsearch.list
RUN set -x \
    && apt-get update \
    && apt-get install -y --no-install-recommends elasticsearch=$VERSION \
    && rm -rf /var/lib/apt/lists/*

ENV PATH /usr/share/elasticsearch/bin:$PATH

WORKDIR /usr/share/elasticsearch
RUN set -ex \
    && for path in \
        ./data \
        ./logs \
        ./config \
        ./config/scripts \
    ; do \
        mkdir -p "$path"; \
        chown -R elasticsearch:elasticsearch "$path"; \
    done

COPY config ./config
VOLUME /usr/share/elasticsearch/data
VOLUME /usr/share/elasticsearch/logs

EXPOSE 9200 9300
USER elasticsearch
CMD elasticsearch
- config
  - elasticsearch.yml
除了Dockerfile之外,还有下面的文件结构:

Exception in thread "main" SettingsException[Failed to open stream for url [/usr/share/elasticsearch/config/elasticsearch.yml]]; nested: AccessDeniedException[/usr/share/elasticsearch/config/elasticsearch.yml];
Likely root cause: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/config/elasticsearch.yml
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
    at java.nio.file.Files.newByteChannel(Files.java:361)
    at java.nio.file.Files.newByteChannel(Files.java:407)
    at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
    at java.nio.file.Files.newInputStream(Files.java:152)
    at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067)
    at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88)
    at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:107)
    at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:100)
    at org.elasticsearch.bootstrap.BootstrapCLIParser.<init>(BootstrapCLIParser.java:48)
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:242)
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
FROM openjdk:8-jre

ENV VERSION 2.4.1

RUN groupadd -r elasticsearch && useradd -r -g elasticsearch elasticsearch
RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 46095ACC8548582C1A2699A9D27D666CD88E42B4
RUN set -x \
    && apt-get update && apt-get install -y --no-install-recommends apt-transport-https && rm -rf /var/lib/apt/lists/* \
    && echo 'deb http://packages.elasticsearch.org/elasticsearch/2.x/debian stable main' > /etc/apt/sources.list.d/elasticsearch.list
RUN set -x \
    && apt-get update \
    && apt-get install -y --no-install-recommends elasticsearch=$VERSION \
    && rm -rf /var/lib/apt/lists/*

ENV PATH /usr/share/elasticsearch/bin:$PATH

WORKDIR /usr/share/elasticsearch
RUN set -ex \
    && for path in \
        ./data \
        ./logs \
        ./config \
        ./config/scripts \
    ; do \
        mkdir -p "$path"; \
        chown -R elasticsearch:elasticsearch "$path"; \
    done

COPY config ./config
VOLUME /usr/share/elasticsearch/data
VOLUME /usr/share/elasticsearch/logs

EXPOSE 9200 9300
USER elasticsearch
CMD elasticsearch
- config
  - elasticsearch.yml

由于映像在另一个VM上工作,我相信它的配置应该是正确的。我也不认为这个问题来自ElasticSearch,因为我似乎有另一张图像有同样的问题(H2)。我对Docker和Linux都是初学者。

在中复制配置后设置文件权限:

COPY config ./config
RUN chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/config

您还可以创建并
chown
作为root用户的
/usr/share/elasticsearch
目录,然后完成处理
/usr/share/elasticsearch
内容的其余步骤,作为
用户elasticsearch
将卷权限更改为777示例:-chmod 777/path/to/volume


请勿授予递归权限

谢谢。在复制成功后设置权限。不知道为什么它在我以前的虚拟机上工作,但我现在很高兴。干杯。从windows到unix的权限映射总是有点混乱。只有当源代码是linux文件系统时,您才能信任它,因此最好只在docker文件中设置您需要的内容,这样就不会出错。