Kubernetes 两个容器之间共享的体积”;忙或被锁定”;

Kubernetes 两个容器之间共享的体积”;忙或被锁定”;,kubernetes,Kubernetes,我有一个运行两个容器的部署。其中一个容器尝试构建(在部署期间)另一个容器nginx尝试提供的javascript包 我想使用一个共享卷在javascript包构建之后放置它 到目前为止,我有以下部署文件(删除了不相关的部分): 我已尽我所能遵循以下指南: 需要指出的另一件事是,我正在尝试使用minikube运行这个本地atm 编辑:我用于生成此图像的Dockerfile是: FROM node:alpine WORKDIR /var/app COPY . . RUN npm insta

我有一个运行两个容器的部署。其中一个容器尝试构建(在部署期间)另一个容器nginx尝试提供的javascript包

我想使用一个共享卷在javascript包构建之后放置它

到目前为止,我有以下部署文件(删除了不相关的部分):

我已尽我所能遵循以下指南:

需要指出的另一件事是,我正在尝试使用
minikube
运行这个本地atm

编辑:我用于生成此图像的Dockerfile是:

FROM node:alpine
WORKDIR /var/app

COPY . .
RUN npm install
RUN npm install -g @vue/cli@latest

CMD ["npm", "run", "build"]
我意识到,当我实际运行映像时,我不需要构建它,但我的下一个目标是将pod实例信息作为环境变量插入,因此不幸的是,使用javascript,我只能在该信息可用时构建它

问题
个人网站
容器中的日志显示:

-  Building for production...
 ERROR  Error: EBUSY: resource busy or locked, rmdir '/var/app/dist'
 Error: EBUSY: resource busy or locked, rmdir '/var/app/dist'
我不知道为什么构建试图删除
/dist
,但我感觉这与此无关。我可能错了

我认为这可能与容器/卷的生命周期有关,但文档建议“在将Pod分配给节点时首先创建emptyDir卷,只要该Pod在该节点上运行,该卷就存在”

问题:
在容器已经运行之后,卷可能不可用的原因有哪些?考虑到你可能比我对Kubernetes有更多的经验,你下一步会做什么?

最好的方法是定制你的图像入口点,如下所示:

  • 完成构建
    /var/app/dist
    文件夹后,将此文件夹复制(或移动)到另一个空路径(.例如:
    /opt/dist

注意:此步骤必须在ENTRYPOINT的脚本中完成,而不是在运行层中

  • 现在改用
    /opt/dist

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      ...
    spec:
      ...
      template:
        ...
        spec:
          hostNetwork: true
          containers:
          - name: personal-site
            image: wheresmycookie/personal-site:3.1
            volumeMounts:
            - name: build-volume
              mountPath: /opt/dist # <--- make it consistent with image's entrypoint algorithm
          - name: nginx-server
            image: nginx:1.19.0
            volumeMounts:
            - name: build-volume
              mountPath: /var/app/dist
    
          volumes:
          - name: build-volume
            emptyDir: {}
    
    apiVersion:apps/v1 种类:部署 元数据: ... 规格: ... 模板: ... 规格: 主机网络:对 容器: -名称:个人网站 图片:wheresmycookie/个人网站:3.1 体积数量: -名称:生成卷
    mountPath:/opt/dist#最好的方法是自定义图像的入口点,如下所示:

    • 完成构建
      /var/app/dist
      文件夹后,将此文件夹复制(或移动)到另一个空路径(.例如:
      /opt/dist

    注意:此步骤必须在ENTRYPOINT的脚本中完成,而不是在运行层中

    • 现在改用
      /opt/dist

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        ...
      spec:
        ...
        template:
          ...
          spec:
            hostNetwork: true
            containers:
            - name: personal-site
              image: wheresmycookie/personal-site:3.1
              volumeMounts:
              - name: build-volume
                mountPath: /opt/dist # <--- make it consistent with image's entrypoint algorithm
            - name: nginx-server
              image: nginx:1.19.0
              volumeMounts:
              - name: build-volume
                mountPath: /var/app/dist
      
            volumes:
            - name: build-volume
              emptyDir: {}
      
      apiVersion:apps/v1 种类:部署 元数据: ... 规格: ... 模板: ... 规格: 主机网络:对 容器: -名称:个人网站 图片:wheresmycookie/个人网站:3.1 体积数量: -名称:生成卷
      mountPath:/opt/dist#为什么不在映像的Dockerfile中运行此构建序列,仅在构建时运行一次,而不是在每个副本上重新运行一次,并在pod重新启动时再次运行它呢?
      rmdir'/var/app/dist'
      看起来可能没有必要,但就构建序列而言,该步骤失败了(由于该目录上安装了某些内容,因此无法删除)一旦该步骤失败,构建就完成了。更完整地描述一下MyCookie/personal site:3.1图像的确切功能会很有帮助。@DavidMaze我很想在javascript构建中插入关于pod实例的信息,仅此而已。我将更新该问题以包含Dockerfile!为什么不运行这个b在映像的Dockerfile中生成序列,仅在生成时生成一次,而不是在每个副本中重新运行一次,然后在pod重新启动时重新运行它。
      rmdir'/var/app/dist'
      看起来可能没有必要,但就生成序列而言,该步骤失败(由于该目录上安装了某些内容,因此无法删除)一旦这个步骤失败,构建就完成了。更完整地描述一下mycookie/personal site:3.1图像的确切功能会很有帮助。@DavidMaze我很想在javascript构建中插入关于pod实例的信息,仅此而已。我会更新这个问题以包含Dockerfile!谢谢你的帮助回答!我现在就试试看,如果可行的话,我会向上投一票。但我仍然不清楚为什么会出现这个错误以及为什么这个解决方案会起作用。你能在那里详细说明一下吗?谢谢你进入pod的容器,运行
      df-h
      ,你会看到什么是繁忙的设备:)谢谢!看起来像是“建造"command试图删除该卷-您的建议非常有效!谢谢您的回复!我现在就尝试一下,如果有效的话,我会投赞成票。我仍然不清楚我为什么会出现这个错误以及为什么这个解决方案会起作用。您能在那里详细说明一下吗?谢谢您进入p的容器od,运行
      df-h
      ,您将看到哪些是繁忙的设备:)谢谢!似乎“build”命令试图删除卷-您的建议非常有效!
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        ...
      spec:
        ...
        template:
          ...
          spec:
            hostNetwork: true
            containers:
            - name: personal-site
              image: wheresmycookie/personal-site:3.1
              volumeMounts:
              - name: build-volume
                mountPath: /opt/dist # <--- make it consistent with image's entrypoint algorithm
            - name: nginx-server
              image: nginx:1.19.0
              volumeMounts:
              - name: build-volume
                mountPath: /var/app/dist
      
            volumes:
            - name: build-volume
              emptyDir: {}