Docker之主机拷贝⽂件到docker镜像容器
上⼀篇《Docker之⾃定义镜像制作与运⾏(⼀)》我们已经知道怎么运⾏⾃定义镜
像了,但是我们的项⽬运⾏环境⼀般都是会带有配置⽂件的,那么这么将这些配置
⽂件拷贝到镜像中呢?我们就来实践⼀下:
⾸先启动⾃定义镜像容器:jpress
docker run -d -p 8888:8080 jpress
查看容器进程
docker ps
进⼊容器内部
⾄此,我们已经看到容器内部的情况了,接下来我们把⾃⼰⾃定义的⽂件拷贝
到/usr/local ⽬录下,⾸先我们看下/usr/local⽬录下有哪些⽂件
cd /usr/local
拷贝单个⽂件到docker容器中:
因为我的系统是Windows的,所以在F盘下创建⼀个⽂件,内容为:
之前安装docker是我安装在D:\java_dev⽬录下的,可以在docker终端查看
那么我们就要先把docker终端⽬录切换到F盘下:
我们已经看到了的⽂件了,接下来就准备将这个⽂件拷贝到容器
的/usr/local⽬录下
docker 7a25b276ce7e:/usr/local/
说明⼀下:7a25b276ce7e是指Jpress容器的ID或者name
然后我们再看⼀下docker容器中是不是多了⼀个⽂件
我们看到jpress容器已经在第⼆次执⾏的时候多了⼀个⽂件了,那么我们来
查看是不是确实是我们主机上的⽂件呢?
可以看出就是我本机上的⽂件,为什么会出现不⼀样呢,那是因为cat显⽰中⽂异常
问题,⼩伙伴可以通过设置cat编码集解决。
拷贝⽂件夹到docker容器中:
⾸先我们还是在F盘中有⼀个logs⽂件夹,⾥⾯有相关⽇志的⼏个⽂件
然后还是在docker终端切换到F盘下,执⾏命令
docker cp logs 7a25b276ce7e:/usr/local/
然后我们看下/usr/local/⽬录下是否拷贝成功
可以看到我们已经把⽂件成功的拷贝到/usr/local⽬录下⾯了。
注意:通过上⾯的⽅法将⽂件拷贝到容器有⼀个很⼤的缺点,那就是当容器stop之后,然后再启动运⾏,之前拷贝的⽂件都已经不存在了,这个是为什么呢?
Docker镜像是由多个⽂件系统(只读层)叠加⽽成.当我们启动⼀个容器的时候,Docker 会加载镜像层并在其上添加⼀个读写层.如果运⾏中的容器修改了现有的⼀个已存在的⽂件,那该⽂件将会从读写层下的只读层复制到读写层,该⽂件的只读版本仍然存在,只是已经被读写层中该⽂件的副本所隐藏.当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失.在Docker中,只读层以及在顶部的读写层的组合被称为Union File System(联合⽂件系统)
解决⽅案:通过Docker Volume修改docker的⽂件挂载,后续我会说明怎么使⽤它。
第⼆种拷贝⽂件⽅案:
那有没有什么可以直接⼀点呢?当然有,那就是在构建的时候就拷贝进去,那么就需要修改Dockerfile ⽂件,我们来操作⼀下。
⾸先我们把之前的docker容器服务停⽌⼀下
我们先把之前的和logs⽂件拷贝到Dockerfile⽂件⽬录下,这样便于⽂件拷贝,该⽂件在docker默认安装⽬录下:
然后我们来编辑Dockerfile⽂件
vi Dockerfile
接下来就是重新构建镜像
docker build -t jpress:latest .
由于我本地已经把jpress.war⽂件删除了,所以构建失败,但是正因为失败,我们可以发现为什么之前拷贝的⽂件在重启之后会消失,因为镜像容器是构建在/tmp 临时⽂件下的,你⼀旦重启服务之后,这个tmp就会刷新到最初状态,所以⽂件就不存在了。docker重启容器命令
⽂件不存在了,要么参照我之前⼀篇⽂章《Docker之⾃定义镜像制作与运⾏
(⼀)》去github上下载,要么参照下⼀篇⽂件从docker容器中拷贝出来。
⽂件已经准备好,重新构建镜像:
docker build -t jpress:latest .
可以看到我们的镜像已经重新构建成功了,那我们再看⼀下本地的镜像有哪些
docker images
可以看出jpress就是我们刚才构建的镜像,从构建时间可以看出,接下来我们再看下刚才构建的镜像是
否把我们所需要的⽂件都拷贝到我们知道的⽬录下了呢?
我们先运⾏⼀下容器,然后进⼊容器内部查看各个⽂件所在的位置是否存在
好了,我们已经看到所有的⽂件已经完全拷贝到镜像之中了,那么再也不怕丢失,即使是重启服务也没事了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。