You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:24:52