如何模仿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问题的几个讨论主题:
- https://github.com/GoogleCloudPlatform/kubernetes/issues/6120
- https://github.com/GoogleCloudPlatform/kubernetes/issues/831
但是,我可以build议你有一个更好的替代devise?
- 如果你的资产被locking在容器的上线位置,那么你可以使用
gitRepo
卷,它可以在上线的时候将它复制到一个emptyDir
,这意味着你不需要移动内容,直接下载到共享目录。 - 如果您的资产被locking在正在构build的容器的位置,那么最好使用Docker COPY命令复制它们。
- 如果你真的想坚持这样做的话,你必须把内容复制到
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。
- 是否有可能将Docker Hub公开托pipe的映像部署到Kubernetes Container Engine,而无需将其上传到Container Contay?
- 如何将Container VM上的docker容器与清单链接起来?
- 在Kubernetes上的分期和生产
- Neo4j – 如何使用Docker镜像从安全连接访问螺栓?
- 在gcloud项目中共享dockerregistry映像
- 本地文件转移到Kubernentes持续卷?
- 无法从Google计算引擎实例运行gcloud docker push
- 将Docker映像推送到Google Containerregistry时,导致身份validation错误的原因是什么?
- 写入卷装时,Kubernetes pod内存不足