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

时间:2016-09-08 18:08:18

标签: security docker

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

问题

是否可以让docker容器中的非root用户访问托管卷?

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

3 个答案:

答案 0 :(得分:11)

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

一种解决方案是让您的容器以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

入口点脚本将更改所需的权限,然后将/usr/bin/myapp作为appuser运行。

答案 1 :(得分:3)

如果主机env没有appuserappgroup,则会抛出错误,因此最好使用用户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,那么它应该有效。

答案 2 :(得分:1)

在使用自定义Dockerfile构建的镜像的具体情况下,您可以执行以下操作(使用debian镜像的示例命令):

    FROM baseimage
    ...
    RUN useradd --create-home appuser
    USER appuser
    RUN mkdir /home/appuser/my_volume
    ...

然后使用

挂载卷
-v /some/folder:/home/appuser/my_volume

现在 appuser 拥有对该卷的写入权限,因为它位于其主目录中。如果卷必须安装在其主目录之外,您可以创建它并分配 appuser 写入权限,作为 Dockerfile 中的一个额外步骤。