
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Dockle 帮助您:
bash$ brew untap goodwithtech/dockle # 若使用 0.1.16 或更早版本 $ brew install goodwithtech/r/dockle $ dockle [您的镜像名称]
| 特性 | https://github.com/goodwithtech/dockle | https://github.com/hadolint/hadolint | https://github.com/docker/docker-bench-security | https://github.com/coreos/clair |
|---|---|---|---|---|
| 目标 | 镜像 | Dockerfile | 主机 Docker 守护进程 镜像 容器运行时 | 镜像 |
| 运行方式 | 二进制 | 二进制 | Shell 脚本 | 二进制 |
| 依赖 | 无 | 无 | 部分依赖 | 无 |
| 适合 CI | ✓ | ✓ | × | × |
| 用途 | 安全审计 Dockerfile 检查 | Dockerfile 检查 | 安全审计 Dockerfile 检查 | 漏洞扫描 |
可在 Mac OS X 或 Linux 和 WSL(Windows 子系统) 上使用 Homebrew 安装:
bash$ brew install goodwithtech/r/dockle
bash$ VERSION=$( curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \ grep '"tag_name":' | \ sed -E 's/.*"v([^"]+)".*/\1/' \ ) && rpm -ivh https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.rpm
bash$ VERSION=$( curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \ grep '"tag_name":' | \ sed -E 's/.*"v([^"]+)".*/\1/' \ ) && curl -L -o dockle.deb https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.deb $ sudo dpkg -i dockle.deb && rm dockle.deb
可从 Arch 用户仓库安装 dockle-bin:
bashpikaur -Sy dockle-bin
或
bashyay -Sy dockle-bin
bash$ VERSION=$( curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \ grep '"tag_name":' | \ sed -E 's/.*"v([^"]+)".*/\1/' \ ) && curl -L -o dockle.zip https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Windows-64bit.zip $ unzip dockle.zip && rm dockle.zip $ ./dockle.exe [镜像名称]
可从 https://github.com/goodwithtech/dockle/releases/latest 获取最新版本二进制文件。下载对应操作系统/架构的归档文件,解压后将二进制文件放入 $PATH 目录(类 Unix 系统通常为 /usr/local/bin)。
注意:确保设置执行权限(
chmod +x dockle)。
bash$ GO111MODULE=off go get github.com/goodwithtech/dockle/cmd/dockle $ cd $GOPATH/src/github.com/goodwithtech/dockle && GO111MODULE=on go build -o $GOPATH/bin/dockle cmd/dockle/main.go
Docker Hub 上提供 https://hub.docker.com/r/goodwithtech/dockle%EF%BC%8C%E5%8F%AF%E5%9C%A8%E5%AE%89%E8%A3%85%E5%91%BD%E4%BB%A4%E5%89%8D%E8%AF%95%E7%94%A8%EF%BC%9A
bash$ VERSION=$( curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \ grep '"tag_name":' | \ sed -E 's/.*"v([^"]+)".*/\1/' \ ) && docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ goodwithtech/dockle:v${VERSION} [您的镜像名称]
仅当需要扫描主机上的镜像时,才需挂载 docker.sock(-v /var/run/docker.sock:/var/run/docker.sock)。
只需指定镜像名称(和标签):
bash$ dockle [您的镜像名称]
FATAL - CIS-DI-0009: 使用 COPY 而非 ADD 指令 * 使用 COPY : /bin/sh -c #(nop) ADD file:81c0a803075715d1a6b4f75a29f8a01b21cc170cfc1bff6702317d1be2fe71a3 in /app/credentials.json FATAL - CIS-DI-0010: 不要在环境变量/文件中存储凭证 * 发现可疑文件 : app/credentials.json FATAL - DKL-DI-0005: 清理 apt-get 缓存 * 在 'apt-get install' 后使用 'rm -rf /var/lib/apt/lists' : /bin/sh -c apt-get update && apt-get install -y git FATAL - DKL-LI-0001: 避免空密码 * 发现无密码用户! 用户名 : nopasswd WARN - CIS-DI-0001: 为容器创建用户 * 最后用户不应为 root INFO - CIS-DI-0005: 启用 Docker 内容信任 * 在 docker pull/build 前执行 export DOCKER_CONTENT_TRUST=1 INFO - CIS-DI-0008: 确认 setuid/setgid 文件安全性 * setuid 文件: app/suid.txt urw-r--r-- * setgid 文件: app/gid.txt grw-r--r-- * setuid 文件: usr/bin/gpasswd urwxr-xr-x * setgid 文件: usr/bin/wall grwxr-xr-x * setuid 文件: bin/su urwxr-xr-x * setuid 文件: bin/umount urwxr-xr-x * setuid 文件: bin/mount urwxr-xr-x * setgid 文件: usr/bin/ssh-agent grwxr-xr-x * setuid 文件: etc/shadow urw-r----- * setuid 文件: usr/bin/chsh urwxr-xr-x * setuid 文件: usr/bin/chfn urwxr-xr-x * setuid 文件: usr/lib/openssh/ssh-keysign urwxr-xr-x * setgid 文件: etc/passwd grw-r--r-- * setgid 文件: sbin/unix_chkpwd grwxr-xr-x * setgid 文件: usr/bin/chage grwxr-xr-x * setuid 文件: usr/bin/passwd urwxr-xr-x * setgid 文件: usr/bin/expiry grwxr-xr-x * setuid 文件: usr/bin/newgrp urwxr-xr-x IGNORE - CIS-DI-0006: 为容器镜像添加 HEALTHCHECK 指令
也可通过 Docker 运行 dockle 命令:
bash$ export DOCKLE_LATEST=$( curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \ grep '"tag_name":' | \ sed -E 's/.*"v([^"]+)".*/\1/' \ ) $ docker run --rm goodwithtech/dockle:v${DOCKLE_LATEST} [您的镜像名称]
若需扫描主机上的镜像,需挂载 docker.sock:
bash$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ...
| 代码 | 描述 | 级别※ |
|---|---|---|
| CIS Docker 镜像检查点 | ||
| CIS-DI-0001 | 为容器创建用户 | WARN |
| CIS-DI-0002 | 使用可信基础镜像 | FATAL |
| CIS-DI-0003 | 不要安装不必要的包 | FATAL |
| CIS-DI-0004 | 扫描并重建镜像以包含安全补丁 | FATAL |
| CIS-DI-0005 | 启用 Docker 内容信任 | INFO |
| CIS-DI-0006 | 添加 HEALTHCHECK 指令 | WARN |
| CIS-DI-0007 | 不要单独使用 update 指令 | FATAL |
| CIS-DI-0008 | 确认 setuid 和 setgid 文件安全性 | INFO |
| CIS-DI-0009 | 使用 COPY 而非 ADD | FATAL |
| CIS-DI-0010 | 不要在 Dockerfile 中存储密钥 | FATAL |
| CIS-DI-0011 | 仅安装已验证的包 | INFO |
| Dockle Docker 检查点 | ||
| DKL-DI-0001 | 避免使用 sudo 命令 | FATAL |
| DKL-DI-0002 | 避免敏感目录挂载 | FATAL |
| DKL-DI-0003 | 避免 apt-get upgrade、apk upgrade、dist-upgrade | FATAL |
| DKL-DI-0004 | 使用 apk add --no-cache | FATAL |
| DKL-DI-0005 | 清理 apt-get 缓存 | FATAL |
| DKL-DI-0006 | 避免使用 latest 标签 | WARN |
| Dockle Linux 检查点 | ||
| DKL-LI-0001 | 避免空密码 | FATAL |
| DKL-LI-0002 | UID/GID 唯一性 | FATAL |
| DKL-LI-0003 | 仅包含必要文件 | INFO |
Dockle 包含 5 种检查级别:
| 级别 | 描述 |
|---|---|
| FATAL | 实际且需要谨慎处理的问题 |
| WARN | 实际且需要谨慎处理,但存在有限使用场景(即使官方镜像) |
| INFO | 可能对实用性或性能产生负面影响 |
| SKIP | 未找到目标文件 |
| PASS | 未发现任何问题 |
只需指定镜像名称(和标签):
bash$ dockle goodwithtech/test-image:v1
FATAL - CIS-DI-0001: 为容器创建用户 * 最后用户不应为 root WARN - CIS-DI-0005: 启用 Docker 内容信任 * 在 docker pull/build 前执行 export DOCKER_CONTENT_TRUST=1 FATAL - CIS-DI-0006: 为容器镜像添加 HEALTHCHECK 指令 * 未找到 HEALTHCHECK 语句 FATAL - CIS-DI-0007: 不要单独使用 update 指令 * 应将 'apt-get update' 与 'apt-get install' 组合使用 : /bin/sh -c apt-get update && apt-get install -y git FATAL - CIS-DI-0008: 移除镜像中的 setuid 和 setgid 权限 * 发现 setuid 文件: etc/passwd grw-r--r-- * 发现 setuid 文件: usr/lib/openssh/ssh-keysign urwxr-xr-x * 发现 setuid 文件: app/hoge.txt ugrw-r--r-- * 发现 setuid 文件: app/hoge.txt ugrw-r--r-- * 发现 setuid 文件: etc/shadow urw-r----- FATAL - CIS-DI-0009: 使用 COPY 而非 ADD 指令 * 使用 COPY : /bin/sh -c #(nop) ADD file:81c0a803075715d1a6b4f75a29f8a01b21cc170cfc1bff6702317d1be2fe71a3 in /app/credentials.json FATAL - CIS-DI-0010: 不要在环境变量中存储密钥 * 发现可疑 ENV 键 : MYSQL_PASSWD FATAL - CIS-DI-0010: 不要存储密钥文件 * 发现可疑文件 : app/credentials.json PASS - DKL-DI-0001: 避免 sudo 命令 FATAL - DKL-DI-0002: 避免敏感目录挂载 * 避免挂载敏感目录 : /usr PASS - DKL-DI-0003: 避免 apt-get/apk/dist-upgrade PASS - DKL-DI-0004: 使用 apk add --no-cache FATAL - DKL-DI-0005: 清理 apt-get 缓存 * 使用 'apt-get clean && rm -rf /var/lib/apt/lists/*' : /bin/sh -c apt-get update && apt-get install -y git PASS - DKL-DI-0006: 避免 latest 标签 FATAL - DKL-LI-0001: 避免空密码 * 发现无密码用户! 用户名 : nopasswd PASS - DKL-LI-0002: UID 唯一性 PASS - DKL-LI-0002: GID 唯一性
bash$ docker save alpine:latest -o alpine.tar $ dockle --input alpine.tar
bash$ dockle -f json goodwithtech/test-image:v1 $ dockle -f json -o results.json goodwithtech/test-image:v1
json{ "summary": {
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务