1 前言

在有些场景,我们需要把外部的文件放到Docker容器中,或者Kubernetes的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实现数据访问。

欢迎关注微信公众号,将持续为你更新...

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐