これは助けを求めるものですか? (はいの場合は、トラブルシューティングガイドとコミュニティサポートチャネルを使用する必要があります。http://kubernetes.io/docs/troubleshooting/を参照してください。):いいえ
これを提出する前に、Kubernetesの問題でどのキーワードを検索しましたか? (重複が見つかった場合は、代わりにそこに返信する必要があります。):コマンドが見つかりませんconfigmap kubernetes
これはバグレポートですか、それとも機能リクエストですか? (1つ選択してください):バグ
Kubernetesバージョン( kubectl version
):
クライアントバージョン:v1.6.1 GitCommit: "b0b7a323cc5a4a2019b2e9520c21c7830b7f708e"
サーバーバージョン:v1.6.0 GitCommit: "fff5156092b56e6bd60fff75aad4dc9de6b6ef37
環境:
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何が起こったのか:
エントリポイントと同じディレクトリにマウントされている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
にマウントしたいとします。 次に、知っておくべきことを以下に示します。
mountPath
オーバーライドするため、この場合、 /app
フォルダーにはsettings.json
のみが含まれます。mountPath: /app/settings.json
を指定する必要があります。そうすれば、 /app
フォルダー内の元のコンテンツは影響を受けません。これはあなたが最終的に得るものです:
containers:
- volumeMounts:
- name: demo-config
mountPath: /app/settings.json
subPath: settings.json
volumes:
- name: demo-config
configMap:
name: demo
@ zhouhaibing089
返信ありがとうございます、あなたの提案に基づいて動作します、私は説明に感謝します
この問題を解決できてうれしいです
パット
参考までに、このソリューションの最初の言及はここにあるようです: https :
これに関するドキュメントが欠落しているように見えるため、このケースはかなり混乱/誤解を招く可能性があり、プロジェクションドキュメントも同様に誤解を招くようです-自動更新は明らかにその問題に従って機能しないため、欠落しているかどうかはわかりません
mountPath
とsubPath
両方でファイル名を指定するという要件は、直感に反します。
@ 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_です。
@leebensonのappend: 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
)
最も参考になるコメント
@pmcgrath
こちらでチェックアウトして
私はあなたの問題を理解しているようです。 以前も同じ質問がありますが、実際にはあなたの状況に答えがあります。
簡単に言うと、configmap(
settings.json: blahblah
)があり、フォルダー/app
にマウントしたいとします。 次に、知っておくべきことを以下に示します。mountPath
オーバーライドするため、この場合、/app
フォルダーにはsettings.json
のみが含まれます。mountPath: /app/settings.json
を指定する必要があります。そうすれば、/app
フォルダー内の元のコンテンツは影響を受けません。これはあなたが最終的に得るものです: