docker-copyedit使用样例
0x00 背景
在docker中,我们可以使用Dockerfile来从一个已有的镜像build出一个新镜像.在Dockerfile中,基本上可以对基础镜像的很多配置进行修改.但是其中的环境变量(Env)和VOLUME只能增加,不能删除,有时候会导致比较麻烦的问题.
比如我先下载了一个nginx镜像,然后得到其id,使用docker inspect可以看到其默认有NGINX_VERSION,NJS_VERSION两个环境变量.
docker pull nginx docker images|grep nginx docker inspect 881bd08c0b08
我们可以使用docker-copyedit工具来解决这个问题.
0x01 下载docker-copyedit工具
docker-copyedit的地址为https://github.com/gdraheim/docker-copyedit,使用下面的命令即可下载.在其主页有命令的详细用法,大家可以仔细看下.
git clone https://github.com/gdraheim/docker-copyedit.git
其支持的命令行参数如下.其中commands命令的语法比较特殊,需要仔细看下文档的写法.
0x02 使用docker-copyedit工具删除镜像中不需要的环境变量
使用下面的命令来删除镜像中不需要的环境变量.命令的输出也给出了新的镜像id
./docker-copyedit.py from docker.io/nginx into fc.cxy.com/nginx:1.0 -vv -k rm env NGINX_VERSION and rm env NJS_VERSION
使用docker images确定一下.
对新的镜像docker inspect一下,发现确实没有了.
0x03 可以使用docker-copyedit来删除不需要的VOLUME
如果这个镜像现在有一个/data的volume,那么可以使用 remove volume /data接着进行删除.大家可以自己试下.
docker-copyedit是怎么工作的?
在工具的主页文档里面介绍了这个工具是怎么工作的,大家可以看下.而且docker-copyedit.py的源代码不长,读一下源代码就能弄清楚其逻辑.
工具主要使用了docker save和docker load命令. docker save可以将一个镜像打包成一个tar文件,文件里面包含每层的数据,每层的元数据,以及镜像自己的元数据.如下可以看到这个原始的镜像有3层.
docker save 881bd08c0b08 > /tmp/nginx.tar
tar tvf /tmp/nginx.tar
使用如下的命令可以看到三层数据的具体信息和镜像自己元数据所在的json文件.
tar xvf /tmp/nginx.tar -C /tmp/manifest.json jq . /tmp/manifest.json
使用如下命令可以看到镜像的元数据.
tar xvf /tmp/nginx.tar -C /tmp/ 881bd08c0b08234bd19136957f15e4301097f4646c1e700f7fea26e41fc40069.json jq . /tmp/881bd08c0b08234bd19136957f15e4301097f4646c1e700f7fea26e41fc40069.json
这个信息和docker inspect的是相同.
docker-copyedit的整体工作流程如下:
- 将这个tar文件解压出来的内容全部复制到另外一个目录
- 修改manifast.json文件的内容,让镜像的元数据使用另外一个json文件(这儿使用了hashlib.sha256()来生成新的镜像id)
- 直接根据输入的commands来更改新的json文件内容,比如上面例子就是把Env列表中的两个nginx相关的key删除了.
- 使用tar命令把目录压缩回去,得到新镜像的tar文件
- 使用docker load将新镜像导入
- 使用docker tag给新镜像打上tag
大家如果在使用docker的过程遇到过这个问题,可以尝试用这个工具.如果有其他的方法解决这个问题,欢迎留言讨论.
本文暂时没有评论,来添加一个吧(●'◡'●)