内网离线环境的 CentOS 7.9 装 Docker 20.10,把运行中的容器 docker export 成 tar 再 import 成新镜像,docker run 之后容器立刻 Exited (0),docker inspect 里 Config.Cmd 是 null,加 -it 参数也一样。
这类报错背后常见的原因有几处,逐个排除就行。export 只导出文件系统,CMD、ENTRYPOINT、ENV 这些元数据全都不带;import 时没用 -c 参数把启动命令补回去;原容器的启动命令是 docker run 时临时给的,镜像本身就没有 CMD;导出的是已经停止的容器,运行时写入的临时文件没有同步进去。
上来先对比原镜像和新镜像的配置差异
docker inspect old:v1 --format '{{.Config.Cmd}} {{.Config.Entrypoint}}'
import 时用 --change 补回启动命令
docker import -c 'CMD ["/app/start.sh"]' rootfs.tar new:v1
接着把环境变量和端口声明一起补上
docker import -c 'ENV TZ=Asia/Shanghai' -c 'EXPOSE 8080' rootfs.tar new:v1
起容器确认命令真的被继承
docker run --rm new:v1 /app/start.sh --version
这次没动代码,只在配置和运行环境上找原因。
别只看报错消失,验证要多做一步。docker inspect new:v1 的 Config.Cmd 不再为空,容器启动后保持 Up 状态,业务端口可以正常访问。
这里还有个坑。要完整搬迁镜像应该用 docker save,它会把所有层和元数据一起带走,export 只适合导文件系统做取证。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
