在docker-compose中,我习惯以这种方式创建卷:
volumes:
- ./server:/home/app
- /home/app/node_modules
为了解决node_modules
。
我怎样才能解决kubernetes中的问题?
我创建了以下配置
spec:
containers:
- env: []
image: "image"
volumeMounts:
- mountPath: /home/app
name: vol-app
- mountPath: /home/app/node_modules
name: vol-node-modules
name: demo
volumes:
- name: vol-app
hostPath:
path: /Users/me/server
- name: vol-node-modules
emptyDir: {}
但它不起作用。 node_modules为空
答案 0 :(得分:2)
我刚刚从Docker Swarm过渡到Kubernetes并遇到了同样的问题。我解决的解决方案是使用init容器(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)。
一般的想法是,init容器允许您将图像中的node_modules
目录复制到空卷中,然后将该卷挂载到应用程序的窗格中。
kind: Deployment
apiVersion: apps/v1
metadata:
...
spec:
...
template:
...
spec:
initContainers:
- name: frontend-clone
image: YOUR_REGISTRY/YOUR_IMAGE
command:
- cp
- -a
- /app/node_modules/.
- /node_modules/
volumeMounts:
- name: node-modules-volume
mountPath: /node_modules
containers:
- name: frontend
image: YOUR_REGISTRY/YOUR_IMAGE
volumeMounts:
- name: source-volume
mountPath: /app
- name: node-modules-volume
mountPath: /app/node_modules
volumes:
- name: source-volume
hostPath:
path: /YOUR_HOST_CODE_DIRECTORY/frontend
- name: node-modules-volume
emptyDir: {}
请注意,复制node_modules
目录的命令是cp -a /SOURCE/. /DEST/
,而不是更常见的cp -r /SOURCE/* /DEST/
。后一个命令中的星号将被解释为文字*
而不是逻辑*
,并且它不会按预期匹配每个文件/目录。
您可以使用init容器执行任何操作,甚至可以在初始化时从脚本创建node_modules
目录(尽管它会增加显着的延迟)。
答案 1 :(得分:0)
node_modules为空
因为您正在使用emptyDir
volume
将Pod分配给节点时,首先创建
emptyDir
卷, 只要该Pod在该节点上运行就存在。作为名称 说,它最初是空的。
应用程序应该向其写入数据。