docker windows 上的 Kubernetes,具有 hostPath 的持久卷给出了不允许的操作
Kubernetes on docker for windows, persistent volume with hostPath gives Operation not permitted
我正在尝试将 windows 中的文件夹连接到容器文件夹。这适用于需要读取文件夹中文件的 .NET 应用程序。在一个普通的 docker 容器中,使用 docker-compose,该应用程序可以正常运行,但由于这只是我们必须监控的几个不同应用程序之一,我们正在尝试让 kubernetes 参与进来。这也是我们失败的地方。
作为 kubernetes 的初学者,我使用 kompose.exe 将 compose 文件转换为 kuberetes 风格。但是,无论我使用 hostPath 还是 persistentVolumeClaim 作为标志,我都无法“开箱即用”。对于 hostPath,路径非常不正确,对于 persistentVolumeClaim,我收到一条警告,指出不支持在主机上安装卷。
因此,我尝试自己完成该部分,但既不能使用持久卷,也不能直接在部署文件中输入挂载数据。
我最接近的是我可以进入文件夹,我可以更改到其中的子文件夹,但是一旦我尝试 运行 任何其他命令,无论是 'ls' 还是 'cat' ,我得到“不允许操作”。
这是我的 docker 撰写文件,它按
的预期工作
version: "3.8"
services:
test-create-hw-file:
container_name: "testcreatehwfile"
image: test-create-hw-file:trygg
network_mode: "host"
volumes:
- /c/temp/testfiles:/app/files
运行 对该文件进行转换:
PS C:\temp> .\kompose.exe convert -f .\docker-compose-tchwf.yml --volumes hostPath -v
DEBU Checking validation of provider: kubernetes
DEBU Checking validation of controller:
DEBU Docker Compose version: 3.8
WARN Service "test-create-hw-file" won't be created because 'ports' is not specified
DEBU Compose file dir: C:\temp
DEBU Target Dir: .
INFO Kubernetes file "test-create-hw-file-deployment.yaml" created
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: C:\temp\kompose.exe convert -f .\docker-compose-tchwf.yml --volumes hostPath -v
kompose.version: 1.26.1 (a9d05d509)
creationTimestamp: null
labels:
io.kompose.service: test-create-hw-file
name: test-create-hw-file
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: test-create-hw-file
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: C:\temp\kompose.exe convert -f .\docker-compose-tchwf.yml --volumes hostPath -v
kompose.version: 1.26.1 (a9d05d509)
creationTimestamp: null
labels:
io.kompose.service: test-create-hw-file
spec:
containers:
- image: test-create-hw-file:trygg
name: testcreatehwfile
resources: {}
volumeMounts:
- mountPath: /app/files
name: test-create-hw-file-hostpath0
restartPolicy: Always
volumes:
- hostPath:
path: C:\temp\c\temp\testfiles
name: test-create-hw-file-hostpath0
status: {}
运行 kubectl apply on that file 只是给出臭名昭著的错误“错误:来自守护进程的错误响应:无效模式:/app/files”,这意味着,据我所知,不是那个“/app/files”是错误的,但应该连接的文件夹的格式不正确。这是非常奇怪的 C:\temp\c\temp\testfiles
行。在谷歌搜索和大量阅读之后,我有两种方法可以将其更改为 /c/temp/testfiles
或 /host_mnt/c/temp/testfiles
。两者都以相同的“不允许操作”结束。我正在通过进入 docker 桌面容器上的 CLI 来检查这一点。
测试中的图像只是一个应用程序,除了等待五分钟不退出外,我现在什么都不做,然后我才能检查文件夹。
我以 root 身份登录到 shell,并且在执行 'ls -lA':
时我有文件夹的这一行
drwxrwxrwx 1 root root 0 Feb 7 12:04 files
此外,docker-user
拥有 c:\temp\testfiles
文件夹的完全访问权限。
部分版本数据:
Docker version 20.10.12, build e91ed57
Kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:38:33Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:32:32Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"linux/amd64"}
Kompose version
1.26.1 (a9d05d509)
Host OS: Windows 10, 21H2
//Trygg
感谢 RadekW,问题现已解决。路径应该写成/run/desktop/mnt/host/c/PATH/TO/FILE
,在我的例子中是:/run/desktop/mnt/host/c/temp/testfiles
。如果我找到任何关于此的文档,我会添加一个来源。
很高兴我最初的评论解决了您的问题。我想以正式回答的形式稍微扩展一下我的想法。
要使用 Kubernetes 在 Docker 桌面上为 Windows 安装卷,路径为:
/run/desktop/mnt/host/c/PATH/TO/FILE
不幸的是,没有官方文档,但 here 是一个很好的评论,并解释说这与 Docker 守护进程有关:
/mnt/wsl is actually the mount point for the cross-distro mounts tmpfs
Docker Daemon mounts it in its /run/desktop/mnt/host/wsl directory
我正在尝试将 windows 中的文件夹连接到容器文件夹。这适用于需要读取文件夹中文件的 .NET 应用程序。在一个普通的 docker 容器中,使用 docker-compose,该应用程序可以正常运行,但由于这只是我们必须监控的几个不同应用程序之一,我们正在尝试让 kubernetes 参与进来。这也是我们失败的地方。 作为 kubernetes 的初学者,我使用 kompose.exe 将 compose 文件转换为 kuberetes 风格。但是,无论我使用 hostPath 还是 persistentVolumeClaim 作为标志,我都无法“开箱即用”。对于 hostPath,路径非常不正确,对于 persistentVolumeClaim,我收到一条警告,指出不支持在主机上安装卷。 因此,我尝试自己完成该部分,但既不能使用持久卷,也不能直接在部署文件中输入挂载数据。 我最接近的是我可以进入文件夹,我可以更改到其中的子文件夹,但是一旦我尝试 运行 任何其他命令,无论是 'ls' 还是 'cat' ,我得到“不允许操作”。 这是我的 docker 撰写文件,它按
的预期工作version: "3.8"
services:
test-create-hw-file:
container_name: "testcreatehwfile"
image: test-create-hw-file:trygg
network_mode: "host"
volumes:
- /c/temp/testfiles:/app/files
运行 对该文件进行转换:
PS C:\temp> .\kompose.exe convert -f .\docker-compose-tchwf.yml --volumes hostPath -v
DEBU Checking validation of provider: kubernetes
DEBU Checking validation of controller:
DEBU Docker Compose version: 3.8
WARN Service "test-create-hw-file" won't be created because 'ports' is not specified
DEBU Compose file dir: C:\temp
DEBU Target Dir: .
INFO Kubernetes file "test-create-hw-file-deployment.yaml" created
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: C:\temp\kompose.exe convert -f .\docker-compose-tchwf.yml --volumes hostPath -v
kompose.version: 1.26.1 (a9d05d509)
creationTimestamp: null
labels:
io.kompose.service: test-create-hw-file
name: test-create-hw-file
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: test-create-hw-file
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: C:\temp\kompose.exe convert -f .\docker-compose-tchwf.yml --volumes hostPath -v
kompose.version: 1.26.1 (a9d05d509)
creationTimestamp: null
labels:
io.kompose.service: test-create-hw-file
spec:
containers:
- image: test-create-hw-file:trygg
name: testcreatehwfile
resources: {}
volumeMounts:
- mountPath: /app/files
name: test-create-hw-file-hostpath0
restartPolicy: Always
volumes:
- hostPath:
path: C:\temp\c\temp\testfiles
name: test-create-hw-file-hostpath0
status: {}
运行 kubectl apply on that file 只是给出臭名昭著的错误“错误:来自守护进程的错误响应:无效模式:/app/files”,这意味着,据我所知,不是那个“/app/files”是错误的,但应该连接的文件夹的格式不正确。这是非常奇怪的 C:\temp\c\temp\testfiles
行。在谷歌搜索和大量阅读之后,我有两种方法可以将其更改为 /c/temp/testfiles
或 /host_mnt/c/temp/testfiles
。两者都以相同的“不允许操作”结束。我正在通过进入 docker 桌面容器上的 CLI 来检查这一点。
测试中的图像只是一个应用程序,除了等待五分钟不退出外,我现在什么都不做,然后我才能检查文件夹。 我以 root 身份登录到 shell,并且在执行 'ls -lA':
时我有文件夹的这一行drwxrwxrwx 1 root root 0 Feb 7 12:04 files
此外,docker-user
拥有 c:\temp\testfiles
文件夹的完全访问权限。
部分版本数据:
Docker version 20.10.12, build e91ed57
Kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:38:33Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:32:32Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"linux/amd64"}
Kompose version
1.26.1 (a9d05d509)
Host OS: Windows 10, 21H2
//Trygg
感谢 RadekW,问题现已解决。路径应该写成/run/desktop/mnt/host/c/PATH/TO/FILE
,在我的例子中是:/run/desktop/mnt/host/c/temp/testfiles
。如果我找到任何关于此的文档,我会添加一个来源。
很高兴我最初的评论解决了您的问题。我想以正式回答的形式稍微扩展一下我的想法。
要使用 Kubernetes 在 Docker 桌面上为 Windows 安装卷,路径为:
/run/desktop/mnt/host/c/PATH/TO/FILE
不幸的是,没有官方文档,但 here 是一个很好的评论,并解释说这与 Docker 守护进程有关:
/mnt/wsl is actually the mount point for the cross-distro mounts tmpfs
Docker Daemon mounts it in its /run/desktop/mnt/host/wsl directory