如何让Docker容器中的非root用户访问主机上挂载的卷

我正在Docker容器中以非root用户身份运行我的应用程序。 我做了这个,因为这是最好的做法之一。 但是,在运行容器时,我将一个主机卷挂载到它-v /some/folder:/some/folder 。 我这样做是因为我的应用程序在泊坞窗容器内运行需要写入文件到挂载的主机文件夹。 但是由于我以非root用户的身份运行我的应用程序,因此它没有写入该文件夹的权限

是否有可能让托pipe容器中的非root用户访问托pipe的卷?

如果没有,是我唯一的select,以root用户身份在docker容器中运行进程?

这里没有神奇的解决scheme:docker中的权限与没有docker的权限pipe理相同。 您需要运行相应的chownchmod命令来更改目录的权限。

一个解决scheme是让你的容器以root身份运行,并使用ENTRYPOINT脚本来进行适当的权限更改,然后将你的CMD作为非特权用户。 例如,将以下内容放入entrypoint.sh

 #!/bin/sh chown -R appuser:appgroup /path/to/volume exec runuser -u appuser "$@" 

这假定你有runuser命令可用。 你可以使用sudo来完成同样的事情。

通过在您的Dockerfile中包含一个ENTRYPOINT指令来使用上面的脚本:

 FROM baseimage COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/bin/sh", "entrypoint.sh"] CMD ["/usr/bin/myapp"] 

这将启动容器:

 /bin/sh entrypoint.sh /usr/bin/myapp 

入口点脚本将更改所需的权限,然后以appuser身份运行/usr/bin/myapp

如果主机env没有appuserappgroup ,则会抛出错误,所以最好使用User ID而不是用户名:

在你的容器里面运行

 appuser$ id 

这将显示:

uid = 1000(appuser)gid = 1000(appuser)groups = 1000(appuser)

从主机env运行:

 mkdir -p /some/folder chown -R 1000:1000 /some/folder docker run -v /some/folder:/some/folder [your_container] 

在你的容器内 ,检查

 ls -lh 

看到用户和组名称,如果它不是root ,那么它应该工作。