【问题标题】:Volume shared between two containers "is busy or locked"两个容器之间共享的卷“忙或锁定”
【发布时间】:2020-07-10 08:29:16
【问题描述】:

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

我想在构建后使用共享卷来放置 javascript 包。

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

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: /var/app/dist
      - name: nginx-server
        image: nginx:1.19.0
        volumeMounts:
        - name: build-volume
          mountPath: /var/app/dist
      volumes:
      - name: build-volume
        emptyDir: {}

尽我所能,我遵循了以下指南:

要指出的另一件事是,我正在尝试使用 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 我只能在该信息可用时构建。

问题

personal-site 容器的日志显示:

-  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,但也有一种感觉,这无关紧要。我可能是错的?

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

问题

在容器已经运行后,我可能无法使用某个卷的原因有哪些?鉴于您在 Kubernetes 方面的经验可能比我多得​​多,接下来您会考虑什么?

【问题讨论】:

  • 为什么不在你的镜像的 Dockerfile 中运行这个构建序列,只在构建时运行一次,而不是在每个副本重新运行一次,然后在 Pod 重新启动时再次重新运行它?跨度>
  • rmdir '/var/app/dist' 可能看起来没有必要,但就构建顺序而言,该步骤失败(因为该目录上已安装某些内容,因此无法删除)并且一次该步骤失败,构建完成。更完整地描述 wheresmycookie/personal-site:3.1 图像的作用会有所帮助。
  • @DavidMaze 我很想在 javascript 构建中插入有关 pod 实例的信息,仅此而已。我将更新问题以包含 Dockerfile!

标签: kubernetes


【解决方案1】:

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

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

    cp -r /var/app/dist/* /opt/dist
    

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

  • 现在改用/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: {}
    

祝你好运!

如果不清楚如何自定义入口点,请与我们分享您的图像入口点,我们将实施。

【讨论】:

  • 感谢您的回复!我现在就试一试,如果可行,请投票。我仍然不清楚为什么我会收到这个错误以及为什么这个解决方案会起作用。你能详细说明一下吗?谢谢
  • 进入 pod 的容器,运行 df -h,你会看到什么是繁忙的设备 :)
  • 谢谢!似乎“构建”命令以某种方式试图删除卷 - 您的建议非常有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2019-03-11
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多