我正在使用带有docker的docker-solr映像,我需要在其中安装一个使用-v标志实现的目录.
问题是容器需要写入我已挂载到其中的目录,但似乎没有权限这样做,除非我在整个目录上执行chmod 777.我不认为设置允许所有用户读取和写入的权限是解决方案,但只是一个临时的解决方法.
任何人都可以指导我找到更规范的解决方案吗?
编辑:我一直在运行没有sudo的docker,因为我把自己添加到了docker组.我刚刚发现如果我用sudo运行docker问题就解决了,但我很好奇是否还有其他解决方案.
Github上的dockerfile非常有效地构建了整个项目,但没有解决权限问题.
所以为了解决这个问题,首先我将gosu设置添加到dockerfile(如果你实现了这个通知版本1.4是硬编码的.你可以检查最新版本here).
@H_403_21@# 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,它基本上与su或sudo完全相同,但与docker的工作效果更好.从gosu的描述:
This is a simple tool grown out of the simple fact that su and sudo have very strange and often annoying TTY and signal-forwarding behavior.
现在我对dockerfile做的其他更改是这些添加这些行:
@H_403_21@COPY solr_entrypoint.sh /sbin/entrypoint.sh RUN chmod 755 /sbin/entrypoint.sh ENTRYPOINT ["/sbin/entrypoint.sh"]
并删除该行:
@H_403_21@USER $SOLR_USER
所以默认情况下你是root用户. (这就是为什么我们有gosu从root下台).
至于我自己的入口点文件,我不认为它写得很完美,但它完成了这项工作.
@H_403_21@#!/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命令采用以下形式:
@H_403_21@docker run
基本上入口点说如果我想按照惯例运行solr,我们将参数开始传递给命令的结尾,如下所示:
@H_403_21@docker run
否则运行以root身份传递的命令.
start选项首先为solr用户提供目录的所有权,然后运行默认命令.这解决了所有权问题,因为与dockerfile设置(一次性事物)不同,入口点每次都会运行.
所以现在如果我使用-d标志挂载目录,在入口点实际运行solr之前,它将为您填充docker容器内的文件.
至于这对容器外的文件有什么影响,我的结果好坏参半,因为docker在OSX上行为有点怪异.对我来说,它没有改变容器外的文件,但是在另一个操作系统上,其中docker与文件系统的关系更好,它可能会改变你的文件在外面,但我想这就是你要处理的内容,如果你想要的话将文件挂载到容器中而不是仅仅复制它们.