背景

在使用docker容器过程中,经常需要把docker容器中的目录挂载到宿主机中。如果容器中的目录(target)中存在数据,这个时候直接挂载到宿主机的source目录中,会发现容器target目录下的文件会丢失。

解决办法

方法一: 通过容器卷的方式挂载目录

关于容器卷的使用,请参考https://zhuanlan.zhihu.com/p/597209476

  • 创建挂载卷
docker volume create --name vol_simple
  • 挂载卷

docker run -it -v vol_simple:/data ...

说明

启动容器后,容器中的/data数据会被写入到vol_simple中。测试后发现如果同时再启动一个容器挂载卷后, vol_simple中的数据不会因为新的容器的出现而发生数据改变。

方法二:重新构建镜像
  • 制作Dockerfile文件
vim Dockerfile

# 设置基础镜像
FROM base_image:1.0.0

# 把当前目录下的文件复制到镜像的/datatmp下
COPY  data /datatmp

#制作一个docker-entrypoint.sh脚本,也可以自己写命令
COPY docker-entrypoint.sh /usr/bin/docker-entrypoint.sh

ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
  • 制作docker-entrypoint.sh启动脚本
#!/bin/sh
# 把/datatmp目录下的文件复制到/data目录下
mv /datatmp/* /data
# 启动服务...
sh java -jar app.jar
  • 构建镜像
# 进入到Dockerfile所在的文件目录下(后面的 . 不要忘了)
docker build  -t myapp:1.0.0 .

  • 启动容器
#/host/data是宿主机路径
docker run -it -v /host/data:/data ...

说明

每次重新docker run启动容器,都会把容器中/datatmp/*下的文件复制一遍到/data目录下

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐