我有这个pod定义:
apiVersion: v1
kind: Pod
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 998 # Group ID of docker group on the node
containers:
- name: someconainter
image: someimage
resources:
requests:
memory: "8G"
cpu: "6"
limits:
memory: "10G"
cpu: "8"
imagePullPolicy: Always
tty: true
command:
- cat
volumeMounts:
- mountPath: /var/run
name: docker-sock
volumes:
- name: docker-sock
hostPath:
path: /var/run
其中,我将Docker套接字从节点挂载到pod,如您所见。
然后从pod内,我尝试这样做docker运行命令:
docker run --rm -v ${helmChartFolder}:/chart:ro ubuntu ls -lah
则挂载的/chart
文件夹是完全空的,尽管在pod本身不是
所以这可能是什么原因,我一直在尝试调整-v
参数,甚至尝试--mount
,到目前为止没有运气。
当您在docker容器上执行绑定挂载时,主机端的路径总是从docker守护进程的点开始。假设您的${helmChartFolder}
是这个pod中的一个路径,那么容器中的一个空白目录将表明您的主机在该位置没有任何东西。
如果你想要将该文件夹中的数据共享到docker容器中,那么你最好的选择是复制它。
以下是实现这一目标的众多方法之一:docker create --name mycontainer -v /chart -w /chart ubuntu ls -lah
tar -C ${helmChartFolder} -c . | docker cp - mycontainer:/chart
docker start -a mycontainer
docker rm -v mycontainer
这将创建一个容器与匿名体积/图表(可选使用匿名体积)。'docker cp'将有问题的目录的内容复制到/chart(我使用tar管道技巧非常明确地说明了我希望目录的所有内容如何直接在/chart中结束)。最后,我启动附加的容器,并看到显示/chart内容的输出运行。docker rm
的-v
选项表示显式地清理匿名卷,因此我最终获得一个干净的状态。
这种方法并不是真正特定于在kubernetes pod中运行docker客户端,但它更多地与在有效的远程dockerd上运行docker客户端有关。dockerd不是运行在圆荚体,所以它有自己的文件系统和环境。套接字hostPath只是访问其他地方的dockerd的一种方式。
我在旧的CICD系统中使用类似的'docker cp'类型设置,其中CICD作业对远程dockerd实例运行'docker' cli。我可以将文件复制到或从停止的容器中,这对于在容器运行之前设置容器很方便,或者在它完成后抓取构建工件。