在Linux上以非root用户运行时出现权限错误

88次阅读
没有评论

问题描述

在使用Docker构建镜像时,在Ubuntu 16.04.3 LTS操作系统上遇到了一些意外的错误。用户使用的Docker版本是18.02.0-ce (edge),通过apt安装的。用户通过以下Dockerfile来演示问题:

FROM tomcat:8.5.24-jre8-alpine
RUN adduser -D test
RUN chown -R test "$CATALINA_HOME"
USER test
RUN ls "$CATALINA_HOME"/webapps

在尝试构建这个Dockerfile时,出现了以下错误:

$ docker build -t test test/
Sending build context to Docker daemon  163.4MB
Step 1/5 : FROM tomcat:8.5.24-jre8-alpine ---> 134d23a9a14e
Step 2/5 : RUN adduser -D test ---> Using cache ---> a6f70ba83b8d
Step 3/5 : RUN chown -R test "$CATALINA_HOME" ---> Using cache ---> 8a0fae3db0a8
Step 4/5 : USER test ---> Using cache ---> 45fdf333232b
Step 5/5 : RUN ls "$CATALINA_HOME"/webapps ---> Running in 48711dfb9569
ls: /usr/local/tomcat/webapps/ROOT: Permission denied
ls: /usr/local/tomcat/webapps/examples: Permission denied
ls: /usr/local/tomcat/webapps/docs: Permission denied
ls: /usr/local/tomcat/webapps/host-manager: Permission denied
ls: /usr/local/tomcat/webapps/manager: Permission denied
The command '/bin/sh -c ls "$CATALINA_HOME"/webapps' returned a non-zero code: 1

用户在构建Docker镜像时出现了”Permission denied”错误,尽管之前已经通过chown命令将整个/usr/local/tomcat文件夹(包括子文件夹)的所有权赋予了test用户。用户还发现,在Mac OS上构建镜像时却没有问题。

用户还尝试了一个变通方法,将”test”用户添加到”root”组中,如下所示:

RUN adduser -D test -G root

通过这个简单的改变,Dockerfile成功构建了。因此,问题似乎涉及到了组成员权限,但用户不理解为什么会有这个问题,因为用户已经将文件夹的所有权赋予了用户。

解决方案

以下操作步骤可能受版本差异影响,请谨慎操作。

方案1

根据 https://github.com/docker-library/tomcat/issues/35的描述,这个问题与使用的存储驱动(aufs)相关。将存储驱动更改为overlay2可以解决这个问题。

步骤

  1. 首先,停止Docker服务:
    sh
    sudo systemctl stop docker
  2. 修改Docker配置文件,一般位于/etc/docker/daemon.json,如果没有则创建该文件:
    sh
    sudo nano /etc/docker/daemon.json
  3. 在配置文件中添加以下内容,以使用overlay2作为存储驱动:
    json
    {
    "storage-driver": "overlay2"
    }

    保存并关闭文件。
  4. 删除旧的Docker存储数据,确保旧的存储驱动的数据不会影响新的设置:
    sh
    sudo rm -rf /var/lib/docker
  5. 重新启动Docker服务:
    sh
    sudo systemctl start docker

方案2

如果问题仍然存在,可能是由于一些其他权限机制(如apparmor或selinux)引起的。你可以执行以下步骤来排除这些问题:

步骤

  1. 使用以下命令查看$CATALINA_HOME目录的所有权和权限:
    sh
    ls -al "$CATALINA_HOME"

    确保”test”用户具有适当的权限。
  2. 如果系统中启用了SELinux,请禁用它并尝试构建Docker镜像,查看问题是否解决。

以上是两种可能的解决方案,你可以先尝试方案1,如果问题仍然存在,再考虑使用方案2来进一步排除问题。

总结

在Linux上使用非root用户运行Docker时出现权限错误,可能是由于存储驱动问题引起的。通过将存储驱动更改为overlay2可以解决这个问题。如果问题仍然存在,可能与系统的权限机制有关,可以考虑禁用SELinux来解决问题。

正文完