将文件夹安装到 Kubernetes Pod 内的 Docker 容器中

Mounting folder into Docker container inside a Kubernetes Pod

我有这个 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 args,甚至尝试 --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

这会在 /chart 上创建一个带有匿名卷的容器(使用匿名卷是可选的)。 'docker cp' 将相关目录的内容复制到 /chart(我使用 tar 管道技巧非常明确地说明我希望目录的所有内容直接在 /chart 中结束) .最后,我发送 tar 附加的容器,我看到输出 运行 显示 /chart 的内容。 docker rm-v 选项说要明确清理匿名卷,所以我最终得到一个干净的状态。

这种方法并不是真正特定于 运行在 kubernetes pod 中设置 docker 客户端,但它与 运行设置 docker 有更多关系客户反对实际上是远程的 dockerd。 dockerd 不在那个 pod 中 运行ning,所以它有自己的文件系统和环境。套接字 hostPath 只是访问其他地方的 dockerd 的一种方式。

我在较旧的 CICD 系统中使用了类似的 'docker cp' 类型设置,其中 cicd 作业 运行s 'docker' cli 针对远程 dockerd 实例。我可以将文件复制到停止的容器或从停止的容器复制文件,这对于在 运行s 之前设置容器很方便,或者在它完成后获取构建工件。