Kubernetes: configmap file mount path menghasilkan kesalahan perintah tidak ditemukan

Dibuat pada 23 Apr 2017  ·  10Komentar  ·  Sumber: kubernetes/kubernetes

Apakah ini permintaan bantuan? (Jika ya, Anda harus menggunakan panduan pemecahan masalah dan saluran dukungan komunitas kami, lihat http://kubernetes.io/docs/troubleshooting/.): Tidak

Kata kunci apa yang Anda cari di edisi Kubernetes sebelum mengajukan yang ini? (Jika Anda menemukan duplikat, Anda harus membalas di sana.): command not found configmap kubernetes


Apakah ini LAPORAN BUG atau PERMINTAAN FITUR? (pilih salah satu): BUG

Versi Kubernetes (gunakan kubectl version ):
Versi Klien: v1.6.1 GitCommit:"b0b7a323cc5a4a2019b2e9520c21c7830b7f708e"
Versi Server: v1.6.0 GitCommit:"fff5156092b56e6bd60fff75aad4dc9de6b6ef37

Lingkungan :

  • Penyedia cloud atau konfigurasi perangkat keras :
  • OS (mis. dari /etc/os-release): Host adalah ubuntu 16.04
  • Kernel (misalnya uname -a ): host adalah Linux dev1 4.4.0-72-generic #93-Ubuntu SMP Jum 31 Mar 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
  • Instal alat :
  • Lainnya : Berjalan dari dalam versi minikube: v0.18.0

Apa yang terjadi :
Ketika saya mencoba membuat penerapan dengan file configmap yang dipasang ke direktori yang sama dengan titik masuk, wadah gagal memulai dengan kesalahan berikut
"Respons kesalahan dari daemon: Perintah penampung '/app/app.sh' tidak ditemukan atau tidak ada."
Spesifikasi pod menyertakan configmap yang dipasang ke direktori yang sama dengan titik masuk

Tampaknya skrip titik masuk hilang setelah memasang volume untuk peta konfigurasi di direktori yang sama
Jika saya memasang file configmap ke dalam sub direktori, semuanya berfungsi seperti yang diharapkan

Apa yang Anda harapkan terjadi :
Saya berharap file peta konfigurasi dibuat di direktori tanpa memengaruhi konten direktori yang ada yang dalam hal ini berisi skrip titik masuk

Cara memperbanyaknya (seminimal dan setepat mungkin):

File Docker - perhatikan titik masuknya

FROM busybox:latest

RUN        mkdir /app
COPY       app.sh /app

ENTRYPOINT ["/app/app.sh"]

Skrip titik masuk - loop tak terbatas

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

k8s configmap dan file penyebaran

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 

Ketika saya menjalankan kubectl apply -d k8s.yaml dan melihat pod saya dapat melihat kesalahan berikut

kesalahan rpc: kode = 2 desc = gagal memulai wadah "f9e0112c80ebba568d4b508f99ffb053bf1ae5a4f095ce7f45bff5f38900b617": Tanggapan kesalahan dari daemon: Perintah wadah '/app/app.sh' tidak ditemukan atau tidak ada.

Hal lain yang perlu kita ketahui :
Jika saya mengubah mountPath untuk volume ke direktori lain, itu berfungsi seperti yang diharapkan

Saya menguji ini secara langsung dengan buruh pelabuhan di Host saya (17.03.0-ce) dan itu berfungsi seperti yang diharapkan

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

Komentar yang paling membantu

@pmcgrath

Checkout di sini .

sepertinya saya mengerti masalah Anda. Saya memiliki pertanyaan yang sama sebelumnya, tetapi sebenarnya ada jawaban dalam situasi Anda.

Untuk mempersingkat kasus Anda, Anda memiliki configmap( settings.json: blahblah ), dan ingin memasang ke folder /app . Kemudian di bawah ini adalah apa yang perlu Anda ketahui:

  1. Setelah Anda memasang volume (tidak peduli itu configmap atau lainnya), itu menimpa mountPath , jadi dalam kasus Anda, folder /app hanya akan berisi settings.json .
  2. Saya tahu itu bukan yang Anda harapkan, jadi Anda harus menentukan mountPath: /app/settings.json , hanya dengan cara itu, konten asli di folder /app tidak akan terpengaruh.
  3. baik, ketika Anda melakukan langkah kedua, Anda ingat bahwa configmap sebenarnya adalah daftar pasangan nilai kunci, Anda hanya memerlukan salah satu kunci (meskipun Anda sebenarnya hanya memiliki satu juga), jadi Anda perlu memberi tahu volume mount ke gunakan subpath dari Anda configmap.

Ini adalah sesuatu yang pada akhirnya akan Anda dapatkan:

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

Semua 10 komentar

@pmcgrath

Checkout di sini .

sepertinya saya mengerti masalah Anda. Saya memiliki pertanyaan yang sama sebelumnya, tetapi sebenarnya ada jawaban dalam situasi Anda.

Untuk mempersingkat kasus Anda, Anda memiliki configmap( settings.json: blahblah ), dan ingin memasang ke folder /app . Kemudian di bawah ini adalah apa yang perlu Anda ketahui:

  1. Setelah Anda memasang volume (tidak peduli itu configmap atau lainnya), itu menimpa mountPath , jadi dalam kasus Anda, folder /app hanya akan berisi settings.json .
  2. Saya tahu itu bukan yang Anda harapkan, jadi Anda harus menentukan mountPath: /app/settings.json , hanya dengan cara itu, konten asli di folder /app tidak akan terpengaruh.
  3. baik, ketika Anda melakukan langkah kedua, Anda ingat bahwa configmap sebenarnya adalah daftar pasangan nilai kunci, Anda hanya memerlukan salah satu kunci (meskipun Anda sebenarnya hanya memiliki satu juga), jadi Anda perlu memberi tahu volume mount ke gunakan subpath dari Anda configmap.

Ini adalah sesuatu yang pada akhirnya akan Anda dapatkan:

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

@zhouhaibing089
Terima kasih atas jawabannya, bekerja berdasarkan saran Anda, saya menghargai penjelasannya

Saya senang untuk menutup masalah ini
Menepuk

Untuk referensi, penyebutan asli dari solusi ini tampaknya ada di sini: https://github.com/kubernetes/kubernetes/issues/23748#issuecomment -230390309

Sepertinya dokumentasi untuk ini hilang, yang membuat kasus ini cukup membingungkan/menyesatkan, dan dokumen proyeksi tampaknya membuatnya lebih menyesatkan juga - tidak yakin apakah itu hilang karena pembaruan otomatis tampaknya tidak berfungsi sesuai masalah itu

Persyaratan untuk nama file yang akan ditentukan baik di bawah mountPath dan subPath adalah berlawanan dengan intuisi.

Solusi yang disediakan oleh @zhouhaibing089 berfungsi tetapi konten file yang di-mount di subPath tidak diperbarui jika kita mengeditnya dalam file ConfigMap.

IMO, ini tidak _benar-benar_ terpecahkan. Seharusnya ada opsi untuk menambahkan setiap kunci daripada menimpa.

Sesuatu seperti:

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...
    }

Yang seperti itu...

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

... menyimpan default.conf ada dan artefak lain dari gambar Docker, tetapi menambah dengan example*.conf

Mengulangi info yang sama di subPath hanya _icky_.

+1 pada opsi append: true @leebenson .

Menurut jawaban @leebenson : adakah yang bisa menjelaskan dari mana datangnya opsi append: true ??

itu tidak berhasil untuk saya, saya mendapat:

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

Juga, itu tidak ada di api docs untuk volume mount :
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core

Menurut jawaban @leebenson : adakah yang bisa menjelaskan dari mana datangnya opsi append: true ??

itu tidak berhasil untuk saya, saya mendapat:

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

Juga, itu tidak ada di api docs untuk volume mount :
https://k8smeetup.github.io/docs/api-reference/v1.9/#volumemount -v1-core

itu tidak ada, itu saran. yang baik untuk kasus penggunaan.

Saya mencoba menggunakan metode ini, tetapi saya mendapatkan kesalahan sistem file Read-only, ketika saya menerapkan statefulset. Adakah yang tahu cara memperbaikinya?
(Saya menimpa file yang ada, yang berisi pengaturan untuk elasticsearch, pesan kesalahan aktual --> /usr/share/elasticsearch/bin/run.sh: line 28: ./config/elasticsearch.yml: Read-only file system )

Apakah halaman ini membantu?
0 / 5 - 0 peringkat