Kubernetes节点模块的存储卷

4
在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文件夹为空。

你解决了这个问题吗? - afreeland
2个回答

4
我刚从Docker Swarm转向Kubernetes,遇到了同样的问题。我采用的解决方案利用了init容器(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)。
总体思路是,init容器允许您将node_modules目录从镜像复制到空卷中,然后将该卷挂载到应用程序的pod中。
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目录(尽管这会增加显著延迟)。

嗨,谢谢您提供的信息 - 有没有想法如何解决“没有为版本'apps/v1'注册类型'Deployment'”的问题? - lol
@lol 你正在运行哪个版本的k8s?对于>=1.9使用apiVersion:apps/v1,但在1.8中它是apiVersion:apps/v1beta2,在1.7中它是apiVersion:apps/v1beta1。https://kubernetes.io/docs/reference/workloads-18-19/ - bfin

0

node_modules 是空的

这是因为您正在使用 emptyDir volume

当 Pod 分配给节点时,会首先创建一个 emptyDir 卷,并在该 Pod 在该节点上运行时存在。正如其名称所示,它最初是空的。

应用程序应将数据写入其中。


好的,明白了。但是如何复制docker-compose的行为呢?我正在尝试,但没有成功。 - Mazzy
为什么您不在node_modules中也使用hostPath - Slava Semushin
因为我的 Dockerfile 将 package.json 复制到镜像内,并通过创建 node_modules 文件夹来安装它们。 - Mazzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接