更新: 我连接到minikubevm,我看到我的主机目录已安装,但那里没有文件。此外,当我在那里创建一个文件时,它不会在我的主机中。任何链接都在他们之间
我尝试使用kubernetes安装主机目录以开发我的应用程序。
正如文档推荐的那样,我正在使用minikube在我的电脑上运行我的kubernetes集群。目标是使用docker和kubernetes创建开发环境以开发我的应用程序。我想挂载一个本地目录,以便我的docker从那里读取代码应用程序。但这不起作用。任何帮助都会非常感激。
我的测试应用(server.js):
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World!");
}
var www = http.createServer(handleRequest);
www.listen(8080);
我的Dockerfile:
FROM node:latest
WORKDIR /code
ADD code/ /code
EXPOSE 8080
CMD server.js
我的pod kubernetes配置:(pod-configuration.yaml)
apiVersion: v1
kind: Pod
metadata:
name: apiserver
spec:
containers:
- name: node
image: myusername/nodetest:v1
ports:
- containerPort: 8080
volumeMounts:
- name: api-server-code-files
mountPath: /code
volumes:
- name: api-server-code-files
hostPath:
path: /home/<myuser>/Projects/nodetest/api-server/code
我的文件夹是:
/home/<myuser>/Projects/nodetest/
- pod-configuration.yaml
- api-server/
- Dockerfile
- code/
- server.js
当我在没有hostPath卷的情况下运行docker镜像时,它当然有效,但问题是每次更改时我都必须重新创建我的图像,这对于开发来说真的不是很强大,这就是我需要卷hostPath的原因。
有什么想法吗?为什么我没有成功安装我的本地目录?
感谢您的帮助。
答案 0 :(得分:12)
编辑:看起来解决方案是使用privilaged container,或者手动挂载您的主文件夹以允许MiniKube VM从您的hostPath读取 - https://github.com/boot2docker/boot2docker#virtualbox-guest-additions。 (感谢Eliel搞清楚这一点。)
使用minikube配置hostPath卷是绝对可能的 - 但是有很多怪癖,并且对这个特定问题没有很好的支持。
尝试从Dockerfile中删除ADD code/ /code
。 Docker's "ADD" instruction正在将代码从主机复制到容器的/code
目录中。这就是重建图像成功更新代码的原因。
当Kubernetes尝试将容器的/code
目录挂载到主机路径时,它会发现该目录已经充满了映射到映像中的代码。如果你从构建步骤中取出它,Kubernetes应该能够在运行时成功安装主机路径。
另外,请务必检查主机上code/
目录的权限。
我唯一的其他想法与挂载在根目录中有关。我在向根目录中的目录安装Kubernetes hostPath卷时遇到问题(我假设这是与权限相关的)。所以,要尝试的其他东西就是像/var/www/html
这样的mountPath。
以下是功能性hostPath卷的示例:
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
volumes:
- name: example-volume
hostPath:
path: '/Users/example-user/code'
containers:
- name: example-container
image: example-image
volumeMounts:
- mountPath: '/var/www/html'
name: example-volume
答案 1 :(得分:3)
他们现在给出了适用于所有环境的minikube mount
https://github.com/kubernetes/minikube/blob/master/docs/host_folder_mount.md
在Mac上尝试过
$ minikube mount ~/stuff/out:/mnt1/out
Mounting /Users/macuser/stuff/out into /mnt1/out on the minikube VM
This daemon process needs to stay alive for the mount to still be accessible...
ufs starting
在pod中:
apiVersion: v1
kind: Pod
metadata:
name: myServer
spec:
containers:
- name: myServer
image: myImage
volumeMounts:
- mountPath: /mnt1/out
name: volume
# Just spin & wait forever
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
volumes:
- name: volume
hostPath:
path: /mnt1/out
答案 2 :(得分:-5)
最佳做法是将代码构建到映像中,不应该使用刚来自磁盘的代码运行映像。您的Dockerfile看起来应该更像:
FROM node:latest
COPY /code/server.js /code/server.js
EXPOSE 8080
CMD /code/server.js
然后在没有任何卷的情况下在Kubernetes上运行Image。每次更新代码时,都需要重建映像并更新pod。
另外,我目前还不知道minikube允许在它创建的VM和运行它的主机之间进行挂载。
如果您真的想要在容器运行时更改代码的极快反馈周期,您可以在没有Kubernetes的情况下使用Docker本身-v /path/to/host/code:/code
,然后在准备好构建映像并部署之后并在minikube上测试它。但是,如果您正在更改节点应用的主.js文件,我不确定是否会有效。