Docker commit 不保存数据问题

一、发现问题

1、运行 tomcat:

docker run -d \
--name tomcat \
-p 9999:8080 \
-v /docker/tomcat/webapps:/usr/local/tomcat/webapps \
tomcat

2、在 webapps 添加内容

cd /docker/tomcat/webapps && mkdir H1 && cd H1 && echo "hello mytomcat"

很常规的操作,将 webapps 目录挂载出来,将网页内容添加到 tomcat。

3、通过容器创建镜像

我想添加内容以后,再通过 Docker commit 创建有我自己添加文件的镜像,这样下次就可以直接启动我自己的镜像,而不需要再修改。

docker commit -a "hausen1012" -m "my-tomcat" tomcat mytomcat:1.0

4、启动自己创建的镜像

docker run -d --name tomcat -p 9998:8080 mytomcat:1.0

这里没有创建映射卷,因为我怕把我 webapps 下的内容覆盖。

5、访问 mytomcat

结果:
在这里插入图片描述
当我进入到容器,查看 webapps 下的内容是空的。

后来了解到原来是 Docker commit 创建镜像的时候不会将 VOLUME 外部卷里面的内容复制过去。

二、解决办法

1、检查 tomcat 的 Dockerfile

我查看 tomcat 镜像的 Dockerfilr,发现并没有指定任何的 Volume。

如果原镜像 Dockerfile 使用 VOLUME 命令制定了外部卷,则可能需要直接修改 Dockerfile 文件,创建自己的镜像了。

2、启动 tomcat

docker run -d \
--name tomcat \
-p 9999:8080 \
tomcat

注意不要映射需要添加的文件夹。

3、添加内容

# 创建添加内容
mkdir H1 && cd H1 && echo "hello mytomcat"
# 通过 docker cp 将刚刚创建的复制进去
docker cp H1/ mytomcat:/usr/local/tomcat/webapps/H1

4、通过容器创建镜像

docker commit -a "hausen1012" -m "my-tomcat" tomcat mytomcat:2.0

5、启动自己创建的镜像

docker run -d --name tomcat -p 9998:8080 mytomcat:2.0

这里没有创建映射卷,因为我怕把我 webapps 下的内容覆盖。

6、访问 mytomcat

成功:
在这里插入图片描述

总结:

通过容器创建镜像时,需要保证添加的内容不在外部映射卷下,否则不能将内容复制到新的镜像。

Guess you like

Origin blog.csdn.net/never_late/article/details/120768658