c++ 写文件怎么让0x00不被识别成结束符_使用docker-copyedit工具删除镜像中不需要的环境变量和VOLUME...

docker-copyedit使用样例

0x00 背景

在docker中,我们可以使用Dockerfile来从一个已有的镜像build出一个新镜像.在Dockerfile中,基本上可以对基础镜像的很多配置进行修改.但是其中的环境变量(Env)和VOLUME只能增加,不能删除,有时候会导致比较麻烦的问题.

比如我先下载了一个nginx镜像,然后得到其id,使用docker inspect可以看到其默认有NGINX_VERSION,NJS_VERSION两个环境变量.

docker pull nginxdocker images|grep nginxdocker inspect 881bd08c0b08
4344c84ea55ff82a0db55a08feeaae69.png

下载镜像

9f52850c1d9b9c6c32ada0f4557ec5e3.png

查看镜像id

e8601f1efa2720c2c78cd7fc46266cae.png

查看镜像元数据

我们可以使用docker-copyedit工具来解决这个问题.

0x01 下载docker-copyedit工具

docker-copyedit的地址为https://github.com/gdraheim/docker-copyedit,使用下面的命令即可下载.在其主页有命令的详细用法,大家可以仔细看下.

git clone https://github.com/gdraheim/docker-copyedit.git

其支持的命令行参数如下.其中commands命令的语法比较特殊,需要仔细看下文档的写法.

8a64af032556df17963b91b8154949be.png

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
8053da06c36b70914e36f98209f7787f.png

使用docker images确定一下.

8e7c2511dfeb0711a12b7c99fcbfdaf5.png

对新的镜像docker inspect一下,发现确实没有了.

f704f2dff7124270e6bbcfed8f2ccdc7.png

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
de8704bf771090555c1b4814b95b2924.png
tar tvf /tmp/nginx.tar
d2311dd1c7e53331629803dfca71b1e6.png

使用如下的命令可以看到三层数据的具体信息和镜像自己元数据所在的json文件.

tar xvf /tmp/nginx.tar -C /tmp/manifest.jsonjq . /tmp/manifest.json
28494d09f6ea1dec367596542a5b4d14.png

使用如下命令可以看到镜像的元数据.

tar xvf /tmp/nginx.tar -C /tmp/ 881bd08c0b08234bd19136957f15e4301097f4646c1e700f7fea26e41fc40069.jsonjq . /tmp/881bd08c0b08234bd19136957f15e4301097f4646c1e700f7fea26e41fc40069.json
ed19efd7b0865dd36ff5daa24e53f882.png

这个信息和docker inspect的是相同.

b0a90a3d80d8b3d800db7ec543bf9a8e.png

docker-copyedit的整体工作流程如下:

  • 将这个tar文件解压出来的内容全部复制到另外一个目录
  • 修改manifast.json文件的内容,让镜像的元数据使用另外一个json文件(这儿使用了hashlib.sha256()来生成新的镜像id)
  • 直接根据输入的commands来更改新的json文件内容,比如上面例子就是把Env列表中的两个nginx相关的key删除了.
  • 使用tar命令把目录压缩回去,得到新镜像的tar文件
  • 使用docker load将新镜像导入
  • 使用docker tag给新镜像打上tag

大家如果在使用docker的过程遇到过这个问题,可以尝试用这个工具.如果有其他的方法解决这个问题,欢迎留言讨论.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值