node_modules的kubernetes卷

时间:2017-05-11 08:59:01

标签: docker kubernetes docker-compose

在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为空

2 个答案:

答案 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在该节点上运行就存在。作为名称   说,它最初是空的。

应用程序应该向其写入数据。