引言

  • 目前可以个人手动搭建的本地web靶场都需要源文件中有dockerfile文件,才可使用docker抓取
  • 本博客用”第九届 “强网杯” 全国网络安全挑战赛 线上赛”初赛web赛题”SecretVaulttar”为例

校验文件完整性

下载HashMyfiles软件

  • 将题目源码压缩包放入该软件中,获取对应长度的哈希字符,将该哈希字符与自带的校验字符比对,若一致则文件完整。无损坏
    如:

  • 文件自带哈希:

  • 比对后发现一致,文件完整性良好

获取docker环境

准备虚拟机

  • 自己在VMware中准备一台虚拟机,我就直接使用kail,并且要安装docker及其相关配置。

布置环境

  • 我就懒得写了,具体指令参考该博客:
    利用GitHub、docker部署CTF-web题目复现
    我们可以跳过git拉取文件的那个步奏。因为我们已经有文件源码

  • 大概步奏可以简化为:

    • 在题目文件夹内打开终端

      1
      service docker start
    • 搭建环境(我推荐用我写的这个更稳定的来搭建)

      1
      DOCKER_BUILDKIT=0 docker compose build --pull --no-cache

      一般命令为:

      1
      docker-compose build
    • 然后启动环境

      1
      docker-compose up -d
    • 最后查看靶场端口

      1
      docker ps

      直接进入本地网页:http://127.0.0.1:5555启动靶场

  • 容器过期怎么办?
    使用以下两条命令重启并进入即可:

    1
    docker-compose up -d

    查看端口

    1
    docker ps

个人遇到的一些问题汇总(chatgpt总结)

关于VPN宿主机和虚拟机的通用

  • 需要在vpn插件中关闭直接连接,打开虚拟网卡连接,才可以虚拟机也获得翻墙效果。否则虚拟机无vpn连接

关于docker compose build

docker compose build 默认用 BuildKit

BuildKit 在拉 镜像元数据(config / metadata) 时:

  • 之前网络不稳定 / 被拦 / 中途断过
  • 本地留下 不一致的缓存记录

于是触发:

1
2
failed size validation
failed precondition

镜像其实是存在的,网络后来也是通的

BuildKit 非常严格,一旦发现不一致直接拒绝构建

为什么 docker pull 能成功,但 compose build 不行

  • docker pull
    👉 只管把镜像拉下来,流程简单
  • docker compose build + BuildKit
    👉 先解析、缓存、校验 metadata
    👉 校验失败 → 直接报错

两条路径,不是同一个系统。


最终怎么解决(关键一步)

1
DOCKER_BUILDKIT=0 docker compose build --pull

原理

  • 强制使用 classic builder
  • 绕开 BuildKit 的元数据缓存和严格校验
  • 构建流程变直线 → 直接成功

核心总结(记住这 3 句话就够)

  1. BuildKit 报 size validation / failed precondition ≠ 镜像不存在
  2. docker pull,却 compose build 失败,优先怀疑 BuildKit
  3. 关 BuildKit:DOCKER_BUILDKIT=0,90% 立刻解决

排查方法

能 pull 但 build 报 size validation / precondition,99% 不是网络本身,而是 BuildKit 的“记账缓存”在作怪。

快速决策树

  • pull 都失败 → 网络问题
  • pull 成功,build 失败 → 关 BuildKit

一、测试 pull 能不能成功(只测拉镜像)

1️⃣ 最小网络/Registry 测试(不拉大镜像)

1
docker pull hello-world

判断:

  • ✅ 成功 → Docker 到 registry 基本没问题
  • ❌ 失败 → 网络 / 代理 / 镜像源问题

2️⃣ 测试具体基础镜像(与你 build 用的一致)

1
2
docker pull python:3.13-alpine
docker pull golang:1.25.2-alpine

判断:

  • ✅ 都成功 → 镜像存在 + registry 链路 OK
  • ❌ 某个失败 → 镜像 tag / 网络 / 镜像源问题
    (此时 不用看 build,先修 pull)

3️⃣ 只测试 Registry API 是否可达(判“是不是没网”)

1
curl -I https://registry-1.docker.io/v2/

判断:

  • 返回 401 Unauthorized → ✅ 正常(这是“通了”的标志)
  • 超时 / refused → ❌ 网络层问题

二、测试 build 能不能成功(BuildKit 路径)

4️⃣ 默认 build(使用 BuildKit)

1
docker compose build --pull

判断:

  • ✅ 成功 → 一切正常
  • ❌ 报错:
    • failed size validation
    • failed precondition
    • failed commit on ref

👉 高度怀疑 BuildKit 缓存/元数据问题


三、测试 build(classic builder,对照用)

5️⃣ 关闭 BuildKit 再 build(关键对照)

1
DOCKER_BUILDKIT=0 docker compose build --pull --no-cache

判断:

  • ❌ 默认 build 失败
  • ✅ 这条成功
    ➡️ 结论 100%:BuildKit 是拦路虎(不是网络、不是镜像、不是 Dockerfile)

这一步就是你这次的决定性证据