Docker无法写入使用-v挂载的目录,除非它具有777权限

时间:2015-08-14 02:48:24

标签: linux permissions docker

我正在使用docker的docker-solr图像,我需要在其中安装一个目录,我使用-v标志实现了该目录。

问题是容器需要写入我已挂载到其中的目录,但除非我对整个目录执行chmod 777,否则它似乎没有权限这样做。我不认为设置允许所有用户读取和写入的权限是解决方案,但只是一个临时的解决方法。

有人可以指导我找到更规范的解决方案吗?

编辑:我已经在没有sudo的情况下运行了docker,因为我将自己添加到了docker组。我刚刚发现,如果我使用sudo运行docker,问题就解决了,但我很好奇是否还有其他解决方案。

1 个答案:

答案 0 :(得分:1)

最近,在浏览了一些官方的docker存储库之后,我意识到解决这些权限问题的更惯用的方法是使用名为gosu的东西与入口点脚本一起使用。例如,如果我们采用一个现有的docker项目,例如solr,那就是我之前遇到麻烦的那个。

Github上的dockerfile非常有效地构建整个项目,但没有解决权限问题。

为了解决这个问题,首先我将gosu设置添加到dockerfile中(如果您实现此通知,则版本1.4是硬编码的。您可以检查最新版本here)。

# 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从根降级)。

就我自己的入口点文件而言,我并不认为它写得很完美,但是它完成了这项工作。

#!/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选项 first 为solr用户提供目录的所有权,然后运行默认命令。这解决了所有权问题,因为与dockerfile设置(一次性事物)不同,入口点每次都会运行。

所以现在如果我使用-d标志挂载目录,在入口点实际运行solr之前,它将为您填充docker容器中的 文件。

至于它对容器外的文件有什么影响,我的结果好坏参半,因为docker在OSX上的行为有点怪异。对我来说,它并没有改变容器外的文件,但在另一个操作系统上,其中docker与文件系统的关系更好,它可能会改变你的文件在外面,但我想这就是你&#39;如果要将文件挂载到容器中而不是仅仅复制它们,则必须处理。