1 前言
在有些场景,我们需要把外部的文件放到 Pod 中去,让应用去读取数据。
2 Docker
(1)从宿主复制文件到 Docker 容器:
$ docker exec 6619ff360cce ls /opt/h2-data
pkslow.mv.db
$ docker cp pkslow/pkslow.txt 6619ff360cce:/opt/h2-data
$ docker exec 6619ff360cce ls /opt/h2-data
pkslow.mv.db
pkslow.txt
上面例子成功把 pkslow.txt 复制到了容器的 opt/h2-data 目录上。
(2)从宿主复制目录到 Docker 容器:
$ docker cp pkslow 6619ff360cce:/opt/h2-data
$ docker exec 6619ff360cce ls /opt/h2-data
pkslow
pkslow.mv.db
pkslow.txt
$ docker exec 6619ff360cce ls /opt/h2-data/pkslow
pkslow.txt
(3)从容器复制文件或目录到宿主机器:
$ rm -rf pkslow/
$ docker cp 6619ff360cce:/opt/h2-data/pkslow ./
$ docker cp 6619ff360cce:/opt/h2-data/pkslow/pkslow.txt ./
3 Kubernetes
(1)从客户端复制文件或目录到 Pod :
$ kubectl cp pkslow.txt h2-db-5967bf999f-8qr87:/opt/h2-data
$ kubectl exec h2-db-5967bf999f-8qr87 ls /opt/h2-data
pkslow.mv.db
pkslow.txt
$ kubectl cp pkslow h2-db-5967bf999f-8qr87:/opt/h2-data
$ kubectl exec h2-db-5967bf999f-8qr87 ls /opt/h2-data
pkslow
pkslow.mv.db
pkslow.txt
(2)当要从 Pod 复制文件回来就有点不一样:
# 目标目录要指定,与源文件类型匹配
$ kubectl cp default/h2-db-5967bf999f-8qr87:/opt/h2-data/pkslow ./pkslow
tar: Removing leading `/' from member names
# 目标文件要指定,与源文件类型匹配
$ kubectl cp default/h2-db-5967bf999f-8qr87:/opt/h2-data/pkslow.txt ./pkslow.txt
default 为 namespace ,可以指定。
指定 Pod 的源文件复制目录时,如果以 / 开头,会有以下日志,但实际也会成功复制:
tar: Removing leading `/' from member names
4 总结
对于 Docker 可以通过 mount 一个宿主目录来实现文件共享,这样会方便一些。或者 Docker 内部启动一个 ftp 服务,再把文件传进去。
而对于 Kubernetes 就比较麻烦,可以创建一个共享的 pvc 挂在固定的一个 Pod 里,然后通过 kubectl cp 来实现文件共享,这样其它 Pod 可以通过挂共享的 pvc 实现数据访问。
欢迎关注微信公众号< 南瓜慢说 >,将持续为你更新…