我们在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