
我们在DockerFile里面,要继承一个已有的Docker Image,需要修改原来VOLUME里的内容。
通常的办法,修改VOLUME里面数据后,再保存VOLUME是无效的。
例如我们在/var/www/onlyoffice/Data中加入了一个web文件夹
mkdir /var/www/onlyoffice/Data/web
touch /var/www/onlyoffice/Data/web/test
VOLUME ["/var/www/onlyoffice/Data"]然后启动容器发现/var/www/onlyoffice/Data中空空如也。
我们变通一下使用VOLUME ["/var/www/onlyoffice/Data/web"]呢
mkdir /var/www/onlyoffice/Data/web
touch /var/www/onlyoffice/Data/web/test
VOLUME ["/var/www/onlyoffice/Data/www"]然后启动容器发现,/var/www/onlyoffice/Data/www存在,但是里面还是空的。
因为我们在挂载的/var/www/onlyoffice/Data中再怎么写入数据,哪些数据都是固定的,不会再变动了。
下面我们进入正文,拆包,删除VOLUME的定义,
首先我们把要修改的docker image文件导出
docker save {镜像文件} -o {输出文件}.tar然后用tar拆包
mkdir {输出文件}
tar xf {输出文件}.tar -C {输出文件}然后我们在manifest.json中可以看到各个层的定义
其中第一个字段表示配置文件的名称,我们要改的是这个文件。
"Config":"2b17a854ed0b5118f6625fd29a444ca3e993df5a2c76e4fa394ae998bb376611.json"打开2b17a854ed0b5118f6625fd29a444ca3e993df5a2c76e4fa394ae998bb376611.json文件
找到下面这一段,这里可以看到我们要删除的VOLUME了。
"Volumes": {
    "/etc/onlyoffice": {},
    "/usr/share/fonts/truetype/custom": {},
    "/var/lib/onlyoffice": {},
    "/var/lib/postgresql": {},
    "/var/log/onlyoffice": {},
    "/var/www/onlyoffice/Data": {} //就是这个
},我们搜索/var/www/onlyoffice/Data字段,删除所有相关内容。
我们找到3处关于/var/www/onlyoffice/Data的定义
一个是这样的定义
 {
    "created": "2018-07-13T12:08:54.58653107Z",
    "created_by": "/bin/sh -c #(nop)  VOLUME [/etc/onlyoffice /var/log/onlyoffice /var/lib/onlyoffice /var/www/onlyoffice/Data /var/lib/postgresql /usr/share/fonts/truetype/custom]",
    "empty_layer": true
},还有两个是这样的定义,这里删除的时候一定要注意逗号,,如果删除是最后一行,还要删除上一行逗号。
"Volumes": {
    "/etc/onlyoffice": {},
    "/usr/share/fonts/truetype/custom": {},
    "/var/lib/onlyoffice": {},
    "/var/lib/postgresql": {},
    "/var/log/onlyoffice": {}, //逗号记得删除
    "/var/www/onlyoffice/Data": {} //删除这行
},接下来就是保存修改了,进入之前{输出文件}的文件夹后运行
tar cf ../{输出文件}.tar .最后把新的{输出文件}.tar导回docker
docker load -i {输出文件}.tar							
pch18