Kubernetes / Helm: совместное использование одного файла свойств not между контейнерами Init и Main

В kubernetes (minikube) / helm env у меня есть файл ldif, который я хочу разделить на томе между контейнером Init и обычным контейнером. Я не хочу делиться всей папкой, в которой хранится этот файл.

К сожалению, насколько я понимаю, это невозможно, если файл не является файлом свойств (синтаксис «ключ = значение»).

Я тестировал с помощью configMap / subPath, и кажется, что если синтаксис ключ / значение не соблюдается, контейнер Init даже не запускается, в противном случае все работает, и файл также появляется в основном контейнере.

Поэтому мне интересно, возможно ли вообще осуществить такой обмен.

BR

edit: команда запуска основного контейнера - это запуск одной службы, она не может выполнять копии или перемещать файл, совместно используемый контейнером инициализации, если только это не единственный способ.


person user83647511    schedule 16.12.2019    source источник


Ответы (2)


Да, это возможно, и вы на правильном пути.

Вот пример того, как это сделать.

---
kind: ConfigMap 
apiVersion: v1 
metadata:
  name: example-configmap 
data:
  my-file.ldif: |
     dn: cn=The Postmaster,dc=example,dc=com
     objectClass: organizationalRole
     cn: The Postmastermongodb
---
kind: Pod
apiVersion: v1
metadata:
  name: example-pod
spec:
  volumes: 
  - name: config-volume
    configMap:
      name: example-configmap
  initContainers:
  - name: init
    image: busybox
    volumeMounts:
    - name: config-volume
      mountPath: /path/in/the/init-container/my-file.ldif
      subPath: my-file.ldif
  containers:
  - name: main
    image: busybox
    volumeMounts:
    - name: config-volume
      mountPath: /path/in/the/container/my-file.ldif
      subPath: my-file.ldif

Было бы полезно, если бы вы разместили свою конфигурационную карту. Возможно, вы запутались, потому что для того, чтобы это работало, вам нужно все содержимое вашего файла как значение одного ключа в вашей configmap.

person switchboard.op    schedule 16.12.2019
comment
Это сработало, спасибо :) Я подозреваю, что допустил ошибку в синтаксисе под данными: (отступ?). - person user83647511; 17.12.2019

Чтобы обмениваться файлами между контейнером инициализации и другими контейнерами, вы можете использовать монтирование тома с emptyDir

  volumes:
  - name: cache-volume
    emptyDir: {}

Файл, который контейнер инициализации хочет совместно использовать, может быть скопирован процессом контейнера в mountPath пустогоDir, а затем основной контейнер выбирает его из mouthPath тома emptyDir.

Таким образом, даже после перезапуска модуля соответствующий файл, скажем, в path / path1 / file, копируется в / path2 / file (mouthPath of emptyDir в initcontainer), а затем остается там, поскольку emptyDir монтируется в основной контейнер, пока модуль перезапускается

person Shambu    schedule 16.12.2019
comment
Спасибо за ответ :). Что, если запуск основного контейнера должен выполняться одной командой (в данном случае для запуска службы), поэтому общий файл должен быть уже на месте? (забыл добавить требование, мое плохое) - person user83647511; 17.12.2019