Docker镜像Dockle检测异常求助:权限、用户与HEALTHCHECK问题
关于Docker镜像构建与Dockle检测异常的问题
一、镜像构建详情
我使用以下命令构建镜像:
docker build -t nginx:stable .
对应的Dockerfile内容如下:
FROM nginx:stable USER root WORKDIR /home/ COPY ./nginx/nginx.conf /etc/nginx/ COPY ./start.sh /home/ RUN apt-get update; \ apt-get install -y gcc spawn-fcgi libfcgi-dev; \ rm -rf /var/lib/apt/lists/*; \ chmod u-s /bin/su; \ chmod u-s /usr/bin/newgrp; \ chmod u-s /usr/bin/passwd; \ chmod u-s /usr/bin/gpasswd; \ chmod u-s /bin/umount; \ chmod u-s /usr/bin/chfn; \ chmod u-s /usr/bin/chsh; \ chmod u-s /bin/mount; \ chmod g-s /usr/bin/expiry; \ chmod g-s /usr/bin/chage; \ chmod g-s /usr/bin/wall; \ chmod g-s /sbin/unix_chkpwd; \ chown -R nginx:nginx /etc/nginx/nginx.conf; \ chown -R nginx:nginx /home/; \ chown -R nginx:nginx /var/cache/nginx; \ touch /var/run/nginx.pid; \ chown nginx:nginx /var/run/nginx.pid USER nginx HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1 CMD ["sh", "./start.sh"]
二、Dockle检测结果
执行检测命令:
dockle -ak NGINX_GPGKEY -i CIS-DI-0010 -t 5m nginx:stable
得到输出如下:
WARN - CIS-DI-0001: Create a user for the container * Last user should not be root INFO - CIS-DI-0006: Add HEALTHCHECK instruction to the container image * not found HEALTHCHECK statement INFO - CIS-DI-0008: Confirm safety of setuid/setgid files * setuid file: urwxr-xr-x usr/bin/passwd * setgid file: grwxr-xr-x usr/bin/chage * setuid file: urwxr-xr-x usr/bin/newgrp * setuid file: urwxr-xr-x usr/bin/chsh * setuid file: urwxr-xr-x bin/umount * setuid file: urwxr-xr-x usr/bin/chfn * setgid file: grwxr-xr-x sbin/unix_chkpwd * setuid file: urwxr-xr-x bin/mount * setgid file: grwxr-xr-x usr/bin/expiry * setgid file: grwxr-xr-x usr/bin/wall * setuid file: urwxr-xr-x usr/bin/gpasswd * setuid file: urwxr-xr-x bin/su
三、疑问与附加错误
我明明已经切换到nginx用户、修改了相关文件权限,且配置了HEALTHCHECK指令,为何这些异常仍然存在?尝试删除USER root、调整用户切换顺序都无法解决问题。
另外执行docker build -t img:new .时出现以下错误(已翻译为中文):
FATAL 无法初始化镜像结构体:初始化源失败:读取docker.io/library/img中的new清单时:请求访问资源被拒绝
问题分析与解决方法
1. CIS-DI-0001、CIS-DI-0006、CIS-DI-0008异常
大概率是Docker构建缓存导致旧镜像层未更新:
- 执行
docker build --no-cache -t nginx:stable .强制重新构建,跳过所有缓存层,确保所有指令都被重新执行。 - 构建完成后,用
docker inspect nginx:stable | grep -A5 "User"确认最终用户是否为nginx;用docker history nginx:stable查看镜像层,确认HEALTHCHECK指令是否存在;用docker run --rm nginx:stable ls -l /bin/su /usr/bin/passwd验证文件权限是否已移除s位。
如果重新构建后仍有问题,检查以下点:
- 确认
nginx用户在基础镜像中存在(官方nginx:stable默认包含该用户)。 - 检查
RUN指令中的文件路径是否与检测输出一致(比如检测输出中的usr/bin/passwd对应你指令中的/usr/bin/passwd,路径是正确的)。 - 排查安装的依赖包是否重置了文件权限:可以单独执行
apt-get install -y gcc spawn-fcgi libfcgi-dev后检查权限,确认是否是安装操作导致s位被重新添加。
2. docker build -t img:new .权限错误
这个错误是因为Dockerfile中的FROM指令指定了img:new,而该镜像既不存在于本地,也不是Docker Hub上的公开镜像,Docker尝试远程拉取时失败。解决方法:
- 检查Dockerfile的
FROM行,确保使用的是存在的镜像(比如FROM nginx:stable)。 - 如果
img:new是你自己的镜像,先确保已经成功构建该镜像,再在新的Dockerfile中引用它。
内容的提问来源于stack exchange,提问作者Kortin
相关产品推荐
相关产品推荐

