最近,我在查看一些官方的Docker存储库后意识到解决这些权限问题的更加惯用的方法是使用称为
gosu的东西与入口点脚本配合使用。例如,如果我们采取现有的Docker项目,例如solr,就像我之前遇到的问题一样。
在Github上的dockerfile非常有效地构建了整个项目,但没有考虑权限问题。
因此,为了克服这个问题,首先我向dockerfile添加了gosu设置(如果您实施此操作,请注意版本1.4
已硬编码。您可以在这里检查最新版本)。
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的描述中得知:
这是一个简单的工具,因为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-> "
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上会表现得有些奇怪。对我来说,它并没有改变容器外的文件,但在另一个更好处理文件系统的操作系统上,它可能会改变容器外的文件,但我想如果您想挂载文件到容器内而不仅是把它们复制进去,那就必须面对这个问题。