问题描述
在使用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可以解决这个问题。
步骤
- 首先,停止Docker服务:
sh
sudo systemctl stop docker - 修改Docker配置文件,一般位于
/etc/docker/daemon.json
,如果没有则创建该文件:
sh
sudo nano /etc/docker/daemon.json - 在配置文件中添加以下内容,以使用overlay2作为存储驱动:
json
{
"storage-driver": "overlay2"
}
保存并关闭文件。 - 删除旧的Docker存储数据,确保旧的存储驱动的数据不会影响新的设置:
sh
sudo rm -rf /var/lib/docker - 重新启动Docker服务:
sh
sudo systemctl start docker
方案2
如果问题仍然存在,可能是由于一些其他权限机制(如apparmor或selinux)引起的。你可以执行以下步骤来排除这些问题:
步骤
- 使用以下命令查看
$CATALINA_HOME
目录的所有权和权限:
sh
ls -al "$CATALINA_HOME"
确保”test”用户具有适当的权限。 - 如果系统中启用了SELinux,请禁用它并尝试构建Docker镜像,查看问题是否解决。
以上是两种可能的解决方案,你可以先尝试方案1,如果问题仍然存在,再考虑使用方案2来进一步排除问题。
总结
在Linux上使用非root用户运行Docker时出现权限错误,可能是由于存储驱动问题引起的。通过将存储驱动更改为overlay2可以解决这个问题。如果问题仍然存在,可能与系统的权限机制有关,可以考虑禁用SELinux来解决问题。