Том, совместно используемый двумя контейнерами, "занят или заблокирован" - PullRequest
0 голосов
/ 10 июля 2020

У меня есть развертывание с двумя контейнерами. Один из контейнеров пытается создать (во время развертывания) пакет javascript, который пытается обслуживать другой контейнер, nginx.

Я хочу использовать общий том для размещения пакета 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.

РЕДАКТИРОВАТЬ: Dockerfile, который я использовал для создания этого образа:

FROM node:alpine
WORKDIR /var/app

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

CMD ["npm", "run", "build"]

Я понимаю, что мне не нужно создавать это, когда я на самом деле запустить образ, но моя следующая цель - вставить информацию об экземпляре модуля в качестве переменных среды, поэтому с 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'

Я не уверен, почему сборка d пытается удалить /dist, но есть ощущение, что это не имеет значения. Я мог ошибаться?

Я подумал, что, возможно, это может быть связано с жизненным циклом контейнеров / томов, но в документации предполагается, что «Том emptyDir сначала создается, когда Pod назначается узлу, и существует пока этот модуль работает на этом узле ".

Вопрос

По каким причинам том может быть недоступен для меня после того, как контейнеры уже запущены? Учитывая, что у вас, вероятно, гораздо больше опыта работы с Kubernetes, чем у меня, что бы вы изучили дальше?

1 Ответ

2 голосов
/ 10 июля 2020

Лучший способ - настроить точку входа вашего изображения следующим образом:

  • После завершения sh создания папки /var/app/dist скопируйте (или переместите) эту папку в другую пустую папку. path (.eg: /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: {}
    

Удачи!

Если не понятно, как настроить точку входа, поделитесь с нам ваша точка входа в изображение, и мы его реализуем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...