21

更新:我连接到 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 的原因。

任何的想法 ?为什么我没有成功挂载我的本地目录?

谢谢您的帮助。

4

3 回答 3

13

编辑:看起来解决方案是使用特权容器,或者手动挂载您的主文件夹以允许 MiniKube VM 从您的 hostPath 读取 - https://github.com/boot2docker/boot2docker#virtualbox-guest-additions . (感谢 Eliel 解决了这个问题)。

绝对可以使用 minikube 配置 hostPath 卷 - 但是有很多怪癖并且对这个特定问题没有很好的支持。

尝试ADD code/ /code从 Dockerfile 中删除。Docker 的“添加”指令将代码从主机复制到容器的/code目录中。这就是重建映像成功更新代码的原因。

当 Kubernetes 尝试将容器的/code目录挂载到主机路径时,它发现该目录已经充满了烘焙到镜像中的代码。如果您将其从构建步骤中移除,Kubernetes 应该能够在运行时成功挂载主机路径。

还要确保检查code/主机上目录的权限。

我唯一的其他想法与安装在根目录中有关。在将 Kubernetes hostPath 卷挂载到/从根目录中的目录中时遇到问题(我认为这是与权限相关的)。因此,要尝试的其他方法是 mountPath 之类的/var/www/html.

下面是一个功能性 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
于 2016-08-02T19:08:58.847 回答
7

他们现在给出了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

在吊舱中:

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
于 2018-06-21T12:47:10.833 回答
-4

最佳实践是将代码构建到您的映像中,您不应该使用仅来自磁盘的代码运行映像。您的 Dockerfile 应该看起来更像:

FROM node:latest COPY /code/server.js /code/server.js EXPOSE 8080 CMD /code/server.js

然后在没有任何卷的 Kubernetes 上运行镜像。每次更新代码时都需要重建镜像并更新 pod。

另外,我目前不知道 minikube 允许在它创建的 VM 和您运行它的主机之间挂载。

如果您真的想要在容器运行时更​​改代码的极快反馈周期,您可以在-v /path/to/host/code:/code没有 Kubernetes 的情况下单独使用 Docker,然后一旦您准备好构建映像并在 minikube 上部署和测试它。但是,如果您要更改节点应用程序的主 .js 文件,我不确定这是否可行。

于 2016-08-02T08:57:03.987 回答