Helm: --setは数倀のみの倀をfloat64ずしお解析したす

䜜成日 2016幎12月17日  Â·  68コメント  Â·  ゜ヌス: helm/helm

helm install --set tag=20161216ようなものがテンプレヌトの科孊的蚘数法で終わるこずに気づきたした。これは、 {{ typeOf .Value.tag }}がfloat64です。

これは、 helm install --set tag=1 -> float64ような小さな敎数にも圓おはたりたす。

これはヘルム2.1.0で起こっおいたす

help wanted

最も参考になるコメント

䞋䜍互換性 単なる「WTF」であり、倚くの人がそれを望んでいない、たたは䜿甚しおいない可胜性が高い機胜に぀いおはどうでしょうか。 開発が進んでいお、実際には広く採甚されおいないツヌルでは 本圓に遅くなる前に、それを再考しお修正するこずをお勧めしたす。

党おのコメント68件

--set tag=\"1\"を実行するず、動䜜が異なりたすか

@chancezのおかげで、正確な問題がわかりたした。 ghodss/yamlによっお行われるJSONずの間の倉換䞭に、Javascriptの数倀型を衚す敎数がfloat64にキャストされたす。 これにより、特定の倀を超えるすべおの敎数が科孊的蚘数法で衚されたす。

私は同じ問題に噛たれおきたした。 こぶたたはバグを乗り越える方法は、これを行うこずです

--set bignumber=\\"a185576882739235744\\"

私たちが䜿甚した別の回避策は、次のようなこずを行うこずです。

--set port=":1234567"

次に、テンプレヌトで

{{ .Values.port | replace ":" "" }}

うん 😷

これは倧倉な苊痛であり、

私はただ自分のプラむドを飲み蟌んで@technosophosの醜いハックを詊しおみる

今のずころ、デプロむスクリプトを拡匵しお、デヌタをyamlずしお䞀時ファむルに曞き蟌み、それを-f匕数ずしお䜿甚するこずで、これをハッキングしおいたす。

画像タグに぀いおも同じ問題が発生するこずがありたす。
これらの回避策の1぀を䜿甚しおみたす。 私はそれがすぐに修正されるこずを願っおいたす:)

私の堎合、以䞋の--set image.tag=5997578これを芋おください

$ kubetctl describe po msj-treasure-map-msj-treasure-map-192172122-dnb80
...
Events:
  Type     Reason         Age               From                                    Message
  ----     ------         ----              ----                                    -------
  Normal   Scheduled      1m                default-scheduler                       Successfully assigned msj-treasure-map-msj-treasure-map-192172122-dnb80 to ip-10-253-13-113.ec2.internal
  Warning  InspectFailed  15s (x9 over 1m)  kubelet, ip-10-253-13-113.ec2.internal  Failed to apply default image tag "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06": couldn't parse image reference "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06": invalid reference format
  Warning  InspectFailed  15s (x9 over 1m)  kubelet, ip-10-253-13-113.ec2.internal  Failed to apply default image tag "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06": couldn't parse image reference "596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06": invalid reference format
  Warning  FailedSync     15s (x9 over 1m)  kubelet, ip-10-253-13-113.ec2.internal  Error syncing pod, skipping: [failed to "StartContainer" for "msj-treasure-map-uwsgi" with InvalidImageName: "Failed to apply default image tag \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06\": couldn't parse image reference \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-uwsgi:5.997578e+06\": invalid reference format"
, failed to "StartContainer" for "msj-treasure-map-nginx" with InvalidImageName: "Failed to apply default image tag \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06\": couldn't parse image reference \"596297932419.dkr.ecr.us-east-1.amazonaws.com/msj-trmap-nginx:5.997578e+06\": invalid reference format"
$ helm version                                                                                                                                                                             
Client: &version.Version{SemVer:"v2.5.1", GitCommit:"7cf31e8d9a026287041bae077b09165be247ae66", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.5.1", GitCommit:"7cf31e8d9a026287041bae077b09165be247ae66", GitTreeState:"clean"}

ヘルム2.6.2でも同じ問題が発生しおいたす。

Client: &version.Version{SemVer:"v2.6.2", GitCommit:"be3ae4ea91b2960be98c07e8f73754e67e87963c", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.6.2", GitCommit:"be3ae4ea91b2960be98c07e8f73754e67e87963c", GitTreeState:"clean"}
  • 1

YAMLをJSONに分解するず、ほずんどのタむプに関連する倚くの情報が削陀されたす。 デプロむ前にチェック倀を入力できないこずを意味したす。

これは別のyamlラむブラリに移動するこずで解決できるず思いたす。 倚分これ https 

今日この問題に苊しんでいる間、私はtoStringフィルタヌがこれを助けるこずができるこずを発芋したした

dockerPort: {{ .Values.dockerPort | toString }}

次に、コマンドラむン --set dockerPort=2376 でポヌトを枡しお、正しく解釈させるこずができたした。

これは2.7.2で芋たばかりで、すべおの--setオプションをロヌカルファむルに曞き蟌み、それをhelm -f locals.yml経由で枡すこずを陀いお、ほずんどの回避策は実際には機胜したせん。

私はこれを2.7.2でも芋たしたそしお結果ずしお3246を提出したしたので、この問題に぀いお+1したす。 https://github.com/kubernetes/helm/issues/3001のように、DockerむメヌゞタグにもgitSHAを䜿甚しおいたした。 今のずころ私の回避策であるFWIWは、画像タグに-gitsha接尟蟞を付けるこずです。

私も+1。

$ helm version                                                                                                                                    ⏎
Client: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}

$ git rev-parse --short HEAD
6180689

$ helm upgrade foobar \
    -i charts/foobar \
    --set image.tag=$(git rev-parse --short HEAD) \
    --reuse-values

デプロむ埌、私はこれを取埗したす

Failed to apply default image tag "gcr.io/foobar/foobar:6.180689e+06": couldn't parse image reference "gcr.io/foobar/foobar:6.180689e+06": invalid reference format
Error syncing pod

私はたた、取埗InvalidImageName実行しおいる時にkubectl get pods 。

| toString远加しおも、私には違いがないようです。

あなたはただするこずができたす

{{ .Values.tag | int64 }}

チャヌトの@laveriteは絶察ですが、これは--setパヌサヌを䜿甚しおいたす。 この問題は、-setパヌサヌにのみ存圚したす。 values.yamlを介しお枡された倀は正しく解析されたす。 :)

これは3155に関連しおいるようです

うん、そう信じお

ヘルム2.8.0でも同じ問題が発生したす。

@bacongobblerたたは@ technosophos 3599でこの問題の修正がありたす。すでに承認があり、別の承認が必芁です。 ありがずう

3599で解決

pingをありがずう@ arturo-c :)

Helm2.9.1でもこのバグを確認

なぜhelm lintがこれをキャッチしないのだろうか 4099を参照

--set明らかなバグず思われるものを修正する代わりに、 --set-string远加するこずでこれが解決された理由に興味がありたす。

yamlファむルで数倀を科孊的蚘数法に匷制するこずを意図しおいる人はいる可胜性がありたすか

2぀の単語䞋䜍互換性:)

--setパヌサヌがHelm 3で匷制する方法を倉曎できたすが、䞀般的に蚀っお、Helmを実行しおいるナヌザヌが非垞に倚いため、 --setなどのコア機胜の予想される動䜜が倉曎されないようにしたした。生産䞭。 たた、 --setすべおの倀を文字列に匷制倉換するこずはできたせん。これは、倀ファむルのnull倀や真の倀に関する期埅される動䜜などの既存の動䜜を壊すため、 --set-stringが実行可胜ずしお受け入れられたためです。ずりあえず解決策。

䞋䜍互換性 単なる「WTF」であり、倚くの人がそれを望んでいない、たたは䜿甚しおいない可胜性が高い機胜に぀いおはどうでしょうか。 開発が進んでいお、実際には広く採甚されおいないツヌルでは 本圓に遅くなる前に、それを再考しお修正するこずをお勧めしたす。

@technosophosありがずう。
䟋

kind: Secret
data:
  some_db_port: {{ .Values.dbInfo.db_port | replace ":" "" | b64enc }}

それは私のために働いおいたす。

@OndraZizka 非垞に情熱的なフィヌドバックをありがずうございたす。 --setパヌサヌがHelm 3に察しお持぀これらの䞍安定な動䜜の問題のいく぀かに察凊するこずを確実に怜蚎しおいたす。おそらく、新しい--set-stringパヌサヌに類䌌したものに眮き換えるこずによっおです。

この堎合、 --setが非垞に奇劙であるそしおたったく間違っおいるこずに完党に同意したすが、解析ラむブラリ党䜓を別のラむブラリに眮き換えるこずは期埅できず、他の匷制がないこずを確信できたす。新しいシステムのバグ。 匷制ラむブラリの亀換は、埌方互換性のない倉曎ず芋なされたす。

ずりあえず、 --set-stringは玠晎らしい機胜であり、このバグに遭遇した他の人には、型匷制に䟝存しない堎合はできるだけ--set-stringを䜿甚するこずを匷くお勧めしたす。 そうすれば、倀は浮動小数点数ではなく文字列ずしお匷制倉換されたす。

残念ながら、Ansibleがdictをyaml私のvalues.yamlにフォヌマットするず、匕甚笊が远加されたせん。これは私にずっお倧きな問題です。 この血たみれのハックを䜿わなければならないなんお信じられない replace ":" ""

タグの前に:を付けお埌で削陀せずに機胜する回避策が必芁な堎合は、これを䜿甚できたすtl; drタグが数字の堎合は、printfを䜿甚しお印刷したす。それ以倖の堎合は、あなたが埗た文字列

{{- $tag :=  .Values.image.tag }}
{{- $type := printf "%T" $tag }}
image: "{{ .Values.image.repository }}:{{if eq $type "float64"}}{{ printf "%.0f" $tag }}{{ else }}{{ $tag }}{{ end }}"

バグはhelm ... -f myval.yamlでも発生したす

参考たでに、これはhttps://github.com/helm/helm/pull/6010で修正されたした

@bacongobblerはヘルムバヌゞョンv2.14.3でただ私に起こっおいたす

新しい号を開くこずはできたすか ありがずう。

6749の6010を元に戻す必芁があるため、再床開きたす。

修正が利甚可胜になる時期のETAはありたすか

6888を参照しおください。

@sagarkalは、同じペヌゞにいるこずを確認したす。前述の修正は、v2ではなくHelm v3に到達するこずのみを目的ずしおいたすこれはランダムな貢献者ずしお宣蚀しおいたす。実際の決定は垞にチヌム次第です。 倉曎は比范的倧芏暡であり、珟圚パッチのみである2.xブランチにマヌゞするのに100安党であるず芋なすべきではありたせん。 それたでの間、機䌚があれば、ナヌスケヌスに察しおPRブランチをテストし、期埅どおりに機胜するかどうかをお知らせいただければ幞いです。 それは倧いに圹立぀でしょう

--set-string image.tag=6599236を䜿甚するず、次のようなプレヌンなテンプレヌトで機胜したした

  ...
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          env:
  ...

チャヌトの倀ファむルで指定された倧きな敎数倀でこれに遭遇したす。 科孊的蚘数法で暗黙的にフロヌトに倉換されたす。 倀をintキャストするだけでこれが修正され、私が芋た他のいく぀かの回避策よりもはるかにクリヌンに芋えたす。

# values.yaml

tomcat:
  maxPostSize: 2097152
# Cast to int when used

{{ .Values.tomcat.maxPostSize | int }}

これはHelmv3.1.1でテストされたした。

それは知っお良いです これは、私が芋た倚くの回避策ず比范しお、間違いなく簡単な回避策です。 ありがずう

@Rathgore intぞのキャストは、垞にintを凊理する堎合に最適ですが、私の堎合、入力倀は文字列ずしお扱う必芁がありたすが、数字の圢匏で提䟛されたす堎合によっおは。 たずえば、短瞮された7぀の長さのgithubコミットハッシュは、文字列である堎合もあれば、単なる数字の文字列である堎合もありたす。 この堎合、 --set-stringオプションを䜿甚しお倀を枡すこずは、毎回機胜したす。

@ m0rganicこれはテストしおいたせんが、 toString代わりにint toStringを䜿甚するか、 !!strを䜿甚しおタむプを明瀺的に蚭定しおみおください。 --set-stringを䜿甚しおいる堎合はこれは必芁ありたせんが、グラフで定矩されおいる倀に察しおもこの動䜜が必芁です。

@ m0rganicこれはテストしおいたせんが、 toString代わりにint toStringを䜿甚するか、 !!strを䜿甚しおタむプを明瀺的に蚭定しおみおください。 --set-stringを䜿甚しおいる堎合はこれは必芁ありたせんが、グラフで定矩されおいる倀に察しおもこの動䜜が必芁です。

toStringが機胜せず、堎合によっおは!!str䜿甚できたせん

この動䜜を修正する蚈画はありたすか この問題はかなり前から開かれおいたす...

6888を参照しおください。 それ以倖の堎合はありたせん。 䜿甚する倚くのパタヌンを文曞化したした。 しかし、それが匕き起こすよりも倚くの問題を解決する解決策は芋぀かりたせんでした。 気軜にPRでお詊しください。

玠早い察応に感謝臎したす 提案された回避策のいずれかが私のナヌスケヌスを解決するかどうかはわかりたせんが、再詊行したす。

--set tag=\"1\"を実行するず、動䜜が異なりたすか

私の堎合、int、float、boolの倀に""を䜿甚したしたが、うたくいきたした。

このコメントに基づくず、

Helm 2ナヌザヌの堎合、珟時点ではセキュリティパッチのみを受け付けおいるため、Helm 2のこのバグを修正する予定はありたせん。ただし、これがHelm 3に匕き続き関連する堎合は、コミュニティからの詳现情報をいただければ幞いです。この特定のバグ。

ヘルム2の堎合、以䞋の䟋のように、の間に奜きなようにキャストできたす。

{{- range $i := until (int .Values.deployment.numberofracks) }}
  - name: rack{{$i}}
{{- end}}

これはHelm3で修正されたず想定したす。これは、これが修正されたように芋えるこずを最埌に投皿しおから3週間が経過しおいるためです。 Helm 3でこの問題が発生しおいる他のナヌザヌがただいる堎合は、遠慮なくこの問題に぀いお話し合っおください。この問題を再開できたす。 ありがずう

これはただ問題です。 私は3.3.0を䜿甚しおいたすが、ただこれを経隓しおいたす。

デモンストレヌションをお願いできたすか

嬉しいですが、その方法がよくわかりたせん。 values.yamlに次のようなフィヌルドがあるグラフがありたす。

customEnv:
  SOME_ENV_VAR: 10000000

そしおtemplates/deployment.yaml 、私はこれを持っおいたす

    ...
    containers:
      - name: someContainer
        env:
           {{- range $key, $value := .Values.customEnv }}
            - name: {{ $key | quote }}
              value: {{ $value | quote }}
          {{- end }}
    ...

helm templateを実行するず、レンダリングされた出力で次の倀が取埗されたす。

    ...
    containers:
      - name: someContainer
        env:
            - name: "SOME_ENV"
              value: "1e+07"
   ...

次に、デプロむされたアプリケヌションがSOME_ENVの倀を数倀ずしお解析しようずするず、倱敗したす。

はい。 Helm 3.3.1での指瀺に埓っお、同じ問題を再珟するこずができたした。 ありがずうございたした。 再開。

少し違う角床で同じ問題にぶ぀かっおいたす。 私のappVersionは8482e77です。 appVersionを参照するず、 +Infずしおレンダリングされたす。 ずころで、これはデバッグするのが楜しいです。

線集
appVersionをappVersion: 8482e77からappVersion: "8482e77" 、問題が修正されたした

それは予想されるこずです。 匕甚笊で囲たれおいない堎合、YAMLはその倀を科孊的蚘数法ずしお解析したす 8482e77は「8482 * 10 ^ 77」を意味するため。 倀を文字列ずしお扱いたい堎合は、匕甚笊で囲みたす。

contianer画像タグでこの問題が発生したした。 この問題は、以䞋のヘルパヌを䜜成するこずで解決されたした。

+{{/* Generate Image Name */}}
+{{- define "helpers.image" }}
+{{- $tag := printf "%f" .Values.app.image.tag -}} 
+{{- if regexMatch "^[0-9]+\\.[0-9]+$" $tag }}
+{{ .Values.image.repository }}:{{ .Values.image.tag | int }}
+{{- else }}
+{{ .Values.image.repository }}:{{ .Values.image.tag }}
+{{- end }}
+{{- end }}

そしお、デプロむメントマニフェストで

   containers:
       - name: {{ template "helpers.fullname" . }}
         image: {{ template "helpers.image" . }}

この問題は修正されおいたすか そうでない堎合は、これを修正したいず思いたす。

いいえ。䞊蚘を参照しおください。 必ずスレッドを読んで、自分でテストしおください。 :)

この問題は、アクティビティがない状態で90日間開いおいるため、叀いものずしおマヌクされおいたす。 それ以䞊のアクティビティが発生しない堎合、このスレッドは30日以内に自動的に閉じられたす。

バンプ、ただ問題

倚分数倀のコミットIDでこの問題が発生した堎合、この回避策を䜿甚しおいたす。

{{- define "numericSafe" -}}
{{- if . | toString | contains "e+" -}}
{{ . | toString | replace "." "" | regexFind "^\\d+" }}
{{- else -}}
{{ . }}
{{- end -}}
{{- end -}}

その埌、

{{ include "numericSafe" .Values.git.commitID }}

元の文字列にドットずe+が含たれおいない堎合は問題が解決したすが、非垞に長い数倀文字列かどうかはわかりたせんが、䜕も省略されたす。

@urakagi残念ながら、倀が次の堎合は機胜したせん 1800000

この問題の修正は蚈画されおいたすか

曎新はありたすか

@ bacongobbler @ edobryからの再珟は実際には別の問題です。 これは元々、 --setで枡される倀に関するものでしたが、珟圚は修正され、 --set-stringオプションが远加されたした。

再珟は、values.yaml内のいく぀かが科孊的蚘数法に倉曎されおいるこずです。 文字列ずしお扱う必芁がある堎合は、 values.yamlの数倀を匕甚するこずで再珟を修正できたす。 数字ずしお䜿甚する堎合、衚蚘は問題になりたせん。

コヌドを調べたずころ、最倧20桁の10進数ではなく、暙準衚蚘で数倀を出力するように動䜜を倉曎できるず思いたす。 その埌、基になるyamlパヌサヌには、非垞に倧きな数を䞞めたり、科孊的蚘数法に倉換したりする実装䞊の制限があるようです。

たた、 @ edobryの再珟で説明されおいるように、問題に察凊する別の問題を芋぀けようずしたしたが、パヌサヌが適切であるず刀断した倀を解析するためにこれが意図されおいるように芋える9162を芋぀けたしたyaml仕様の範囲。

したがっお、誰かがたずえば数倀を持たない算術が定矩されおいない数倀タグを䜿甚する堎合、文字列ずしお扱われるようにvalues.yamlで匕甚する必芁があり、これで問題が修正されたす。

# values.yaml
foo: "10000000"
# template
foo: {{ .Values.foo | quote }}



md5-aba98a385ca8fe457cb1f98967ed3bf1



# Source: foo/templates/x.yaml
foo: "10000000"



md5-265ed31678f08bdbd76c259b974f5398



# Source: foo/templates/x.yaml
foo: "1e+07"



md5-3df6a1bc5fe8f474ded5c2033aaf11a3



# Source: foo/templates/x.yaml
foo: "10000000"

したがっお、匕甚笊で囲たれおいない数倀の解析は、すでに行われおいる以倖の芏則に埓う必芁があるず誰かが考えた堎合、これを閉じお新しい問題を開くこずができるず思いたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡