zaki work log

作業ログやら生活ログやらなんやら

[kubectl] jsonpathでドットをキー名に含むパスにアクセスするには逆スラッシュでエスケープする

知ってれば何てことないんだけどプチはまりで時間をだいぶ溶かしてしまったので備忘録。
というか.dockerconfigjsonであれば以下の通り。

kubectl get secret ecr-credential -o jsonpath='{.data.\.dockerconfigjson}' | base64 -d

ドットを含むキー名に含むsecretリソース例 (type: docker-registry)

認証が必要なコンテナレジストリにアクセスするときに使うsecretリソースはデフォルトでドットを含む。
例えばECRの認証情報をCLIで作る場合は以下の通り。

kubectl create secret docker-registry ecr-credential \
    --docker-server=****.dkr.ecr.****.amazonaws.com \
    --docker-username=AWS \
    --docker-password=$(aws ecr get-login-password)

生成されるsecretリソースはだいたい以下の通り。

apiVersion: v1
data:
  .dockerconfigjson: eyJh......
kind: Secret
metadata:
  name: ecr-credential
  namespace: default
type: kubernetes.io/dockerconfigjson

この.dockerconfigjsonの値を取り出したい場合、冒頭の通り、キー部分のドットを逆スラッシュでエスケープすれば良い。

kubectl get secret ecr-credential -o jsonpath='{.data.\.dockerconfigjson}' | base64 -d

[key]を使う場合は以下でも可能。

kubectl get secret ecr-credential -o jsonpath="{.data['\.dockerconfigjson']}" | base64 -d

外側もシングルクォートを使う場合はシェルのエスケープの仕様で'\''になるため以下の通り。

kubectl get secret ecr-credential -o jsonpath='{.data['\''\.dockerconfigjson'\'']}' | base64 -d