Docker使用-v挂载目录时,如果没有777权限,无法对目录进行写入。

8
我正在使用docker中的docker-solr镜像,并且需要挂载一个目录,我使用-v标志实现了这一点。
问题在于容器需要向我挂载到其中的目录写入,但似乎没有权限这样做,除非我对整个目录进行chmod 777。我认为设置允许所有用户读写它的权限并不是解决方案,只是一个临时解决办法。
有人能指导我找到更加规范的解决方案吗?
编辑:我一直在不使用sudo运行docker,因为我将自己添加到了docker组中。我刚发现如果我使用sudo运行docker,则问题得到解决,但我很好奇是否还有其他解决方案。

5
这个应用程序在镜像中作为哪个用户运行?如果它以“solr”用户身份运行,那么除非权限设置允许该用户(容器内部看到的uid)写入主机目录,否则它将无法写入。@larsks 的这篇令人惊叹的回答可能会帮助您设置适当的权限。 - Dharmit
1个回答

1
最近,我在查看一些官方的Docker存储库后意识到解决这些权限问题的更加惯用的方法是使用称为gosu的东西与入口点脚本配合使用。例如,如果我们采取现有的Docker项目,例如solr,就像我之前遇到的问题一样。

在Github上的dockerfile非常有效地构建了整个项目,但没有考虑权限问题。

因此,为了克服这个问题,首先我向dockerfile添加了gosu设置(如果您实施此操作,请注意版本1.4已硬编码。您可以在这里检查最新版本)。

# grab gosu for easy step-down from root
RUN mkdir -p /home/solr \
    && gpg --keyserver pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
    && curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture)" \
    && curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture).asc" \
    && gpg --verify /usr/local/bin/gosu.asc \
    && rm /usr/local/bin/gosu.asc \
    && chmod +x /usr/local/bin/gosu

现在我们可以使用gosu,它基本上与susudo完全相同,但在docker中运行更加顺畅。从gosu的描述中得知:

这是一个简单的工具,因为su和sudo具有非常奇怪且经常令人烦恼的TTY和信号转发行为而产生。

现在我对dockerfile进行的其他更改是添加了以下这些行:

COPY solr_entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh
ENTRYPOINT ["/sbin/entrypoint.sh"]

我只是想将我的入口文件添加到Docker容器中。

并且删除以下行:

USER $SOLR_USER

因此默认情况下您是root用户。(这就是为什么我们有gosu来从root降级的原因)。

至于我的入口文件,我认为它并不完美,但它完成了工作。

#!/bin/bash

set -e

export PS1="\w:\u docker-solr-> "

# step down from root when just running the default start command
case "$1" in
    start)
        chown -R solr /opt/solr/server/solr
        exec gosu solr /opt/solr/bin/solr -f
    ;;
    *)
        exec $@
    ;;
esac

一个 docker run 命令的格式如下所示:

docker run <flags> <image-name> <passed in arguments>

基本上,入口点表示如果我想像往常一样运行solr,我们将参数start传递到命令的末尾,如下所示:

docker run <flags> <image-name> start

否则,您需要以root身份传递的命令。

start选项首先给solr用户所有权,然后运行默认命令。这解决了所有权问题,因为与dockerfile设置不同,入口点每次运行。

所以现在如果我使用-d标志挂载目录,在entrypoint实际运行solr之前,它将为您在docker容器内部的文件chown。

至于这对容器外部的文件的影响,我的结果有些混乱,因为docker在OSX上会表现得有些奇怪。对我来说,它并没有改变容器外的文件,但在另一个更好处理文件系统的操作系统上,它可能会改变容器外的文件,但我想如果您想挂载文件到容器内而不仅是把它们复制进去,那就必须面对这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接