如何模仿Kubernetes中的“–volumes-from”

我正在寻找一种模式,允许在Kubernetes中的同一个容器上运行的两个容器之间共享容器。

我的用例是:我有一个Ruby on Rails应用程序在Docker容器中运行。 docker镜像在/app/<app-name>/public目录中包含了静态资源,我需要从同一个pod中运行的nginx容器中访问这些资源。

在'香草'docker,我会用--volumes-from标志来共享这个目录:

 docker run --name app -v /app/<app-dir>/public <app-image> docker run --volumes-from app nginx 

阅读本文档后: https : //github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/volumes.md我试过了(仅提供相关条目):

 spec: containers: - image: <app-image> name: <app-name> volumeMounts: - mountPath: /app/<app-name>/public name: assets - image: nginx name: nginx volumeMounts: - mountPath: /var/www/html name: assets readOnly: true volumes: - name: assets hostPath: path: /tmp/assets 

但:

  • 即使节点上的/tmp/assets存在,也是空的
  • /app/<app-name>/public程序容器内的/app/<app-name>/public也是空的

作为一个解决方法,我将尝试在应用程序容器启动时填充共享目录(只需将cp /app/<app-name>/public/*到共享目录),但是我真的不喜欢这个想法。

问题:如何模仿--volumes-from中的-volumes,或者如果没有直接的副本,我怎样才能将文件从一个容器共享到同一个容器中运行的其他容器?

apiVersion: v1beta3

 Client Version: version.Info{Major:"0", Minor:"17", GitVersion:"v0.17.0", GitCommit:"82f8bdac06ddfacf493a9ed0fedc85f5ea62ebd5", GitTreeState:"clean"} Server Version: version.Info{Major:"0", Minor:"17", GitVersion:"v0.17.0", GitCommit:"82f8bdac06ddfacf493a9ed0fedc85f5ea62ebd5", GitTreeState:"clean"} 

[update-2016-8]在最新的Kubernetes发行版中,您可以使用一个非常好的名为init-container来replace下面我的答案中的postStart部分,这将确保容器顺序。

在这里输入图像说明

:initContainer仍然是一个testing版function,所以这个yaml的工作版本实际上是这样的: http : pod.beta.kubernetes.io/init-containers ,请注意pod.beta.kubernetes.io/init-containers部分。

—原始答案开始—

其实,你可以。 您需要使用容器生命周期处理程序来控制要与其他容器共享的文件/目录。 喜欢:

 --- apiVersion: v1 kind: Pod metadata: name: server spec: restartPolicy: OnFailure containers: - image: resouer/sample:v2 name: war lifecycle: postStart: exec: command: - "cp" - "/sample.war" - "/app" volumeMounts: - mountPath: /app name: hostv1 - name: peer image: busybox command: ["tail", "-f", "/dev/null"] volumeMounts: - name: hostv2 mountPath: /app/sample.war volumes: - name: hostv1 hostPath: path: /tmp - name: hostv2 hostPath: path: /tmp/sample.war 

请查看我的要点了解更多详情:

https://gist.github.com/resouer/378bcdaef1d9601ed6aa

当然你可以使用emptyDir。 因此,war容器可以在没有mess peer / app目录的情况下将其/sample.war共享到对等容器。

如果我们可以忍受/应用被覆盖,那将会简单得多:

 --- apiVersion: v1 kind: Pod metadata: name: javaweb-2 spec: restartPolicy: OnFailure containers: - image: resouer/sample:v2 name: war lifecycle: postStart: exec: command: - "cp" - "/sample.war" - "/app" volumeMounts: - mountPath: /app name: app-volume - image: resouer/mytomcat:7.0 name: tomcat command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"] volumeMounts: - mountPath: /root/apache-tomcat-7.0.42-v2/webapps name: app-volume ports: - containerPort: 8080 hostPort: 8001 volumes: - name: app-volume emptyDir: {} 

答案是 – 现在 – 你不能。 以下是来自Kubernetes问题的几个讨论主题:

但是,我可以build议你有一个更好的替代devise?

  1. 如果你的资产被locking在容器的上线位置,那么你可以使用gitRepo卷,它可以在上线的时候将它复制到一个emptyDir ,这意味着你不需要移动内容,直接下载到共享目录。
  2. 如果您的资产被locking在正在构build的容器的位置,那么最好使用Docker COPY命令复制它们。
  3. 如果你真的想坚持这样做的话,你必须把内容复制到emptyDir卷,这个目录是专门为你正在寻找的东西而devise的(减去不必复制的空间)。

NFS [1]卷也可以解决您的问题,但可能过于复杂。

此外,我build议这两个服务存在于不同的豆荚中,因此可以分别缩放每个服务。 如果需要,您可以创build一个服务端点以在它们之间进行通信。

[1] https://github.com/GoogleCloudPlatform/kubernetes/blob/master/examples/nfs/nfs-web-pod.yaml

未来进一步更新:

现在有一个用于Docker卷的FlexVol插件: https : //github.com/dims/docker-flexvol

在撰写本文的时候,FlexVol仍然是一个alpha特征,所以要注意的是emptor。