我作为非root用户在Docker容器中运行我的应用程序。我这样做是因为它是最好的做法之一。但是,在运行容器时,我将主机卷挂载到-v /some/folder:/some/folder
。我这样做是因为我在docker容器内运行的应用程序需要将文件写入已安装的主机文件夹。但由于我以非root用户身份运行我的应用程序,因此它无权写入该文件夹
问题
是否可以让docker容器中的非root用户访问托管卷?
如果没有,我唯一的选择是以root用户身份在docker容器中运行该进程吗?
答案 0 :(得分:11)
这里没有神奇的解决方案:docker中的权限与没有docker的权限相同。您需要运行相应的chown
和chmod
命令来更改目录的权限。
一种解决方案是让您的容器以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没有appuser
或appgroup
,则会抛出错误,因此最好使用用户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 中的一个额外步骤。