Kubernetes: configmapファイルのマウントパスでコマンドが見つからないというエラーが発生する

作成日 2017年04月23日  ·  10コメント  ·  ソース: kubernetes/kubernetes

これは助けを求めるものですか? (はいの場合は、トラブルシューティングガイドとコミュニティサポートチャネルを使用する必要があります。http://kubernetes.io/docs/troubleshooting/を参照してください。):いいえ

これを提出する前に、Kubernetesの問題でどのキーワードを検索しましたか? (重複が見つかった場合は、代わりにそこに返信する必要があります。):コマンドが見つかりませんconfigmap kubernetes


これはバグレポートですか、それとも機能リクエストですか? (1つ選択してください):バグ

Kubernetesバージョンkubectl version ):
クライアントバージョン:v1.6.1 GitCommit: "b0b7a323cc5a4a2019b2e9520c21c7830b7f708e"
サーバーバージョン:v1.6.0 GitCommit: "fff5156092b56e6bd60fff75aad4dc9de6b6ef37

環境

  • クラウドプロバイダーまたはハードウェア構成
  • OS (例:/ etc / os-releaseから):ホストはubuntu 16.04
  • カーネル(例: uname -a ):ホストはLinux dev1 4.4.0-72-generic#93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU / Linux
  • ツールのインストール
  • その他:minikubeバージョン内から実行:v0.18.0

何が起こったのか
エントリポイントと同じディレクトリにマウントされているconfigmapファイルを使用してデプロイメントを作成しようとすると、コンテナが次のエラーで起動に失敗します
「デーモンからのエラー応答:コンテナコマンド '/app/app.sh'が見つからないか、存在しません。」
ポッド仕様には、エントリポイントと同じディレクトリにマウントされるconfigmapが含まれています

構成マップのボリュームを同じディレクトリにマウントした後、エントリポイントスクリプトが失われたようです
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

k8sconfigmapとデプロイメントファイル

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エラー:コード= 2 desc =コンテナ "f9e0112c80ebba568d4b508f99ffb053bf1ae5a4f095ce7f45bff5f38900b617"の起動に失敗しました:デーモンからのエラー応答:コンテナコマンド '/app/app.sh'が見つからないか存在しません。

私たちが知る必要がある他のこと
ボリュームのmountPathを他のディレクトリに変更すると、期待どおりに機能します

ホスト(17.03.0-ce)のdockerでこれを直接テストしましたが、期待どおりに機能しました

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. 2番目の手順を実行すると、configmapは実際にはキーと値のペアのリストであり、必要なキーは1つだけである(実際には1つしかありませんが)ので、ボリュームマウントに次のように指示する必要があります。 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. 2番目の手順を実行すると、configmapは実際にはキーと値のペアのリストであり、必要なキーは1つだけである(実際には1つしかありませんが)ので、ボリュームマウントに次のように指示する必要があります。 configmapのサブパスを使用します。

これはあなたが最終的に得るものです:

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

@ zhouhaibing089
返信ありがとうございます、あなたの提案に基づいて動作します、私は説明に感謝します

この問題を解決できてうれしいです
パット

参考までに、このソリューションの最初の言及はここにあるようです: https

これに関するドキュメントが欠落しているように見えるため、このケースはかなり混乱/誤解を招く可能性があり、プロジェクションドキュメントも同様に誤解を招くようです-自動更新は明らかにその問題に従って機能しないため、欠落しているかどうかはわかりません

mountPathsubPath両方でファイル名を指定するという要件は、直感に反します。

@ zhouhaibing089によって提供されるソリューションは機能しますが、類似のConfigMapで編集した場合、 subPathマウントされたファイルのコンテンツは更新されません。

IMO、これは_本当に_解決されていません。 上書きするのではなく、各キーを追加するオプションがあるはずです。

何かのようなもの:

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_です。

@leebensonappend: trueオプションで+1。

@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

それは存在しません、それは提案です。 ユースケースに適しています。

この方法を使用しようとしましたが、statefulsetを適用すると、読み取り専用のファイルシステムエラーが発生しました。 誰かがそれを修正する方法を知っていますか?
(elasticsearchの設定を含む既存のファイルを上書きしています。実際のエラーメッセージ-> /usr/share/elasticsearch/bin/run.sh: line 28: ./config/elasticsearch.yml: Read-only file system

このページは役に立ちましたか?
0 / 5 - 0 評価