Kubernetes: Путь монтирования файла configmap приводит к ошибке команда не найдена

Созданный на 23 апр. 2017  ·  10Комментарии  ·  Источник: kubernetes/kubernetes

Это просьба о помощи? (Если да, вам следует использовать наше руководство по устранению неполадок и каналы поддержки сообщества, см. Http://kubernetes.io/docs/troubleshooting/.): Нет

Какие ключевые слова вы искали в выпусках Kubernetes перед тем, как подать это? (Если вы нашли какие-либо дубликаты, вы должны вместо этого ответить там.): Команда не найдена configmap kubernetes


Это ОТЧЕТ ОБ ОШИБКЕ или ЗАПРОС О ФУНКЦИОНИРОВАНИИ? (выберите один): ОШИБКА

Версия Kubernetes (используйте kubectl version ):
Версия клиента: v1.6.1 GitCommit: "b0b7a323cc5a4a2019b2e9520c21c7830b7f708e"
Версия сервера: v1.6.0 GitCommit: "fff5156092b56e6bd60fff75aad4dc9de6b6ef37

Окружающая среда :

  • Облачный провайдер или конфигурация оборудования :
  • ОС (например, из / etc / os-release): хост - ubuntu 16.04
  • Ядро (например, uname -a ): хост - Linux dev1 4.4.0-72-generic # 93-Ubuntu SMP Пт 31 марта 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux
  • Установить инструменты :
  • Другое : Запуск изнутри версии minikube: v0.18.0

Что случилось :
Когда я пытаюсь создать развертывание с файлом configmap, который смонтирован в том же каталоге, что и точка входа, контейнер не запускается из-за следующей ошибки
«Ответ об ошибке от демона: команда контейнера '/app/app.sh' не найдена или не существует».
Спецификация модуля включает конфигурационную карту, которая монтируется в тот же каталог, что и точка входа.

Похоже, сценарий точки входа теряется после монтирования тома для карты конфигурации в том же каталоге.
Если я монтирую файл configmap в подкаталог, все работает, как ожидалось

Что вы ожидали :
Я ожидал, что файл конфигурации конфигурации будет создан в каталоге без изменения существующего содержимого каталога, которое в данном случае содержит сценарий точки входа.

Как это воспроизвести (максимально минимально и точно):

Файл Docker - обратите внимание на точку входа

FROM busybox:latest

RUN        mkdir /app
COPY       app.sh /app

ENTRYPOINT ["/app/app.sh"]

Скрипт точки входа - бесконечный цикл

#!/bin/sh
seq=1
while [[ true ]]; do
    echo "${seq} $(date) working"
    sleep .5s   
    let seq=$((seq + 1))
done

k8s configmap и файл развертывания

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    product: k8s-demo
  name: demo
data:
  settings.json: |
    {
      "store": {
        "type": "InMemory",
    }

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    product: k8s-demo
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
        product: k8s-demo
    spec:
      containers:
      - name: demo
        image: pmcgrath/shellloop:1
        imagePullPolicy: Always
        volumeMounts:
          - name: demo-config
            mountPath: /app
      volumes:
        - name: demo-config
          configMap:
            name: demo
            items:
              - key: settings.json
                path: settings.json 

Когда я запускаю kubectl apply -d k8s.yaml и смотрю на модуль, я вижу следующую ошибку

Ошибка rpc: code = 2 desc = не удалось запустить контейнер «f9e0112c80ebba568d4b508f99ffb053bf1ae5a4f095ce7f45bff5f38900b617»: ответ от демона об ошибке: команда контейнера '/app/app.sh' не найдена или не существует.

Что еще нам нужно знать :
Если я изменю mountPath для тома на любой другой каталог, он будет работать должным образом.

Я тестировал это напрямую с помощью докера на моем хосте (17.03.0-ce), и он работал, как ожидалось

touch settings.json
docker container run -ti -v $(pwd)/settings.json:/app/settings.json pmcgrath/shellloop:1

Самый полезный комментарий

@pmcgrath

Оформить заказ здесь .

Кажется, я понимаю вашу проблему. У меня раньше был тот же вопрос, но на самом деле ответ есть в вашей ситуации.

Вкратце, у вас есть configmap ( settings.json: blahblah ), и вы хотите смонтировать его в папку /app . Тогда ниже то, что вам нужно знать:

  1. После того, как вы смонтируете том (независимо от того, является ли он configmap или другим), он переопределяет mountPath , поэтому в вашем случае папка /app будет содержать только settings.json .
  2. Я знаю, что это не то, что вы ожидали, поэтому вам нужно указать mountPath: /app/settings.json , только так исходное содержимое в папках /app не будет затронуто.
  3. Что ж, когда вы выполняете второй шаг, вы помните, что configmap на самом деле представляет собой список пар ключ-значение, вам нужен только один из ключей (хотя на самом деле у вас также есть только один), поэтому вам нужно указать, что том монтируется на используйте подпуть из вашей configmap.

Это то, что вы в конечном итоге получите:

containers:
- volumeMounts:
  - name: demo-config
    mountPath: /app/settings.json
    subPath: settings.json
volumes:
- name: demo-config
  configMap:
    name: demo

Все 10 Комментарий

@pmcgrath

Оформить заказ здесь .

Кажется, я понимаю вашу проблему. У меня раньше был тот же вопрос, но на самом деле ответ есть в вашей ситуации.

Вкратце, у вас есть configmap ( settings.json: blahblah ), и вы хотите смонтировать его в папку /app . Тогда ниже то, что вам нужно знать:

  1. После того, как вы смонтируете том (независимо от того, является ли он configmap или другим), он переопределяет mountPath , поэтому в вашем случае папка /app будет содержать только settings.json .
  2. Я знаю, что это не то, что вы ожидали, поэтому вам нужно указать mountPath: /app/settings.json , только так исходное содержимое в папках /app не будет затронуто.
  3. Что ж, когда вы выполняете второй шаг, вы помните, что configmap на самом деле представляет собой список пар ключ-значение, вам нужен только один из ключей (хотя на самом деле у вас также есть только один), поэтому вам нужно указать, что том монтируется на используйте подпуть из вашей configmap.

Это то, что вы в конечном итоге получите:

containers:
- volumeMounts:
  - name: demo-config
    mountPath: /app/settings.json
    subPath: settings.json
volumes:
- name: demo-config
  configMap:
    name: demo

@ zhouhaibing089
Спасибо за ответ, работает на основе вашего предложения, я ценю объяснение

Я рад закрыть этот вопрос
Пэт

Для справки, первоначальное упоминание этого решения, похоже, находится здесь: https://github.com/kubernetes/kubernetes/issues/23748#issuecomment -230390309

Похоже, что документация по этому поводу отсутствует, что делает этот случай довольно запутанным / вводящим в заблуждение, а документы проекции, похоже, делают его еще более вводящим в заблуждение - не уверен, что он отсутствует, потому что автоматические обновления, по-видимому, не работают в соответствии с этой проблемой.

Требование указывать имя файла как в mountPath и в subPath противоречит здравому смыслу.

Решение, предоставленное @ zhouhaibing089, работает, но содержимое смонтированного файла по адресу subPath не обновляется, если мы редактируем его в похожей ConfigMap.

ИМО, это действительно не решено. Должна быть возможность добавлять каждый ключ, а не перезаписывать.

Что-то вроде:

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-conf
data:
  example1.conf: |
    server {
      server_name example1.com;
      # config here...
    }
  example2.conf: |
    server {
      server_name example2.com;
      # config here...
    }

Так что...

- name: nginx-conf
  mountPath: /etc/nginx/conf.d
  append: true

... сохраняет существующие default.conf и любые другие артефакты образа Docker, но дополняет их example*.conf

Повторять ту же информацию в subPath - это просто _icky_.

+1 к опции append: true @leebenson .

Согласно ответу @leebenson : может ли кто-нибудь объяснить, откуда идет опция append: true ??

у меня не работает, я получил:

error: error validating "hdfs/21-namenode-statefulset.yaml": error validating data: ValidationError(StatefulSet.spec.template.spec.containers[1].volumeMounts[1]): unknown field "append" in io.k8s.api.core.v1.VolumeMount; if you choose to ignore these errors, turn validation off with --validate=false

Кроме того, его нет в документации api для монтирования тома:
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core

Согласно ответу @leebenson : может ли кто-нибудь объяснить, откуда идет опция append: true ??

у меня не работает, я получил:

error: error validating "hdfs/21-namenode-statefulset.yaml": error validating data: ValidationError(StatefulSet.spec.template.spec.containers[1].volumeMounts[1]): unknown field "append" in io.k8s.api.core.v1.VolumeMount; if you choose to ignore these errors, turn validation off with --validate=false

Кроме того, его нет в документации api для монтирования тома:
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core

его не существует, это предложение. хороший вариант для случая использования.

Я попытался использовать этот метод, но у меня возникла ошибка файловой системы только для чтения, когда я применил набор состояний. Кто-нибудь знает, как это исправить?
(Я перезаписываю существующий файл, содержащий настройки для elasticsearch, фактическое сообщение об ошибке -> /usr/share/elasticsearch/bin/run.sh: line 28: ./config/elasticsearch.yml: Read-only file system )

Была ли эта страница полезной?
0 / 5 - 0 рейтинги