如何在docker commit时更新镜像历史的CREATED BY列?
如何在docker commit时让CREATED BY列显示LABEL指令
问题原因
当用docker build构建镜像时,每一层都对应Dockerfile中的一条指令,docker history会将该指令直接显示在CREATED BY列;而docker commit本质是将容器的当前状态打包为新镜像层,即使通过-c参数添加LABEL这类Dockerfile指令,这些指令只是被用来修改镜像的配置信息,并不会被作为独立的构建步骤记录到CREATED BY中,所以该列只会显示commit <container_id>这类操作描述。
可行解决方案
方案一:改用Dockerfile重新构建(推荐)
把你想要的LABEL等配置写入新的Dockerfile,基于commit后的镜像(或原容器对应的镜像)重新构建,这样docker history就会在CREATED BY列显示对应的LABEL指令。
示例步骤:
- 先将容器提交为基础镜像:
docker commit <container_id> temp-image - 创建新的Dockerfile:
FROM temp-image LABEL version="0.1" - 构建新镜像:
docker build -t final-image . - 查看历史:
docker history final-image
此时就能在CREATED BY列看到LABEL version="0.1"的记录。
方案二:手动修改镜像历史(不推荐)
通过docker save导出镜像,手动修改镜像的历史元数据,再重新导入。这种操作复杂且容易破坏镜像的完整性,仅适合测试场景,不建议在生产环境使用。
示例步骤(仅供参考):
- 导出镜像到本地文件:
docker save <image_id> -o image.tar - 解压tar包并找到对应的历史配置文件(通常在
manifest.json和layers相关的json文件中),修改created_by字段为你想要的LABEL version="0.1"。 - 重新打包tar并导入镜像:
docker load -o modified-image.tar
总结
docker commit的-c参数无法直接让CREATED BY列显示对应的指令,最稳妥的方式是改用Dockerfile构建流程来管理镜像的配置变更。
内容的提问来源于stack exchange,提问作者Deepak Agrawal
相关产品推荐
相关产品推荐

