将文件夹安装到 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 之前设置容器很方便,或者在它完成后获取构建工件。
我有这个 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 之前设置容器很方便,或者在它完成后获取构建工件。