下载机能联网,却没有 Docker 权限,照样可以准备镜像包。用 crane pull 指定目标架构,再检查本地归档。注意:crane export 导出的是文件系统,不能当成同一种镜像包。
其他部署排查记录收在:运维漏洞指南。
1. 下载 crane,核对官方校验值
以下在 Linux x86_64 下载机上操作。下载机的架构决定工具版本,目标镜像可以是 ARM64,两者不要混淆。
mkdir -p crane-demo
cd crane-demo
curl -fLO https://github.com/google/go-containerregistry/releases/download/v0.22.1/go-containerregistry_Linux_x86_64.tar.gz
curl -fLO https://github.com/google/go-containerregistry/releases/download/v0.22.1/checksums.txt
sha256sum --check --ignore-missing checksums.txt
tar -xzf go-containerregistry_Linux_x86_64.tar.gz crane
./crane version
curl -f 遇到 HTTP 错误会失败;校验命令只检查本地已有的对应文件。先确认压缩包校验成功,再运行解压后的工具。最后一条应输出 0.22.1。
ARM64 下载机要选发行页里的 Linux_arm64 包,不能运行上面的 x86_64 程序。工具放在当前目录,不需要 sudo,也不修改系统 Docker 配置。
2. 用 crane 下载镜像,明确指定 ARM64
--platform linux/arm64 决定镜像的目标平台。下面固定用 Alpine 3.22.0 演示,不使用会变化的 latest 标签。
IMAGE=alpine:3.22.0
./crane --platform linux/arm64 pull "$IMAGE" alpine-arm64.tar
命令成功时可以没有输出。本次得到的文件是 4,140,544 字节,但文件存在、大小相近,都不能代替完整性检查。
本次测试把 DOCKER_HOST 指向了一个不存在的套接字,下载仍成功。下载过程没有连接现有 Docker 服务。
3. 检查包是否完整、架构是否正确
validate 检查本地镜像归档。随后从包里的配置读出架构,避免只凭文件名判断。
./crane validate --tarball alpine-arm64.tar
python3 - <<'PY'
import json
import tarfile
with tarfile.open('alpine-arm64.tar') as archive:
manifest = json.load(archive.extractfile('manifest.json'))
config = json.load(archive.extractfile(manifest[0]['Config']))
print(config['os'], config['architecture'], config['config']['Cmd'])
PY
本次输出:
PASS: alpine-arm64.tar
linux arm64 ['/bin/sh']
看到 PASS 和 linux arm64,才确认本地包通过了本次完整性与架构检查。若要准备 x86_64 镜像,把下载命令的平台改为 linux/amd64,并重新校验。
别把 export 得到的 tar 当成镜像归档
同一个镜像,换成这条命令,得到的是根文件系统:
./crane --platform linux/arm64 export "$IMAGE" alpine-rootfs.tar
本次对两个文件逐项检查,区别如下:
| 本地文件 | 实测大小 | 归档内容 |
|---|---|---|
alpine-arm64.tar |
4,140,544 字节 | 有 manifest.json、镜像配置和层 |
alpine-rootfs.tar |
8,799,744 字节 | 直接是 bin/ 等文件系统目录,没有 manifest.json |
需要镜像归档时用 pull;需要提取镜像里的文件时用 export。两个文件都叫 tar,不代表用途相同。
本篇验证到下载、归档完整性和架构检查。没有在目标 Docker 主机执行加载或运行容器,不能据此声称目标应用已启动。镜像包也不包含已有容器的挂载卷、数据库或运行中改动。
所有产物都在 crane-demo 目录。回退时不需要重启 Docker;先确认目录里没有其他资料,再移走本次工具和镜像包即可。
同类问题可查:运维漏洞指南。