Why does Helm Charts interpret 0777 as 511?
It took me quite some time to debug it.
In my values.yaml
file, I had a variable called customScriptDefaultMode
, which was set to 0777
.
File: values.yaml
customScriptDefaultMode: 0777
customScripts:
hello.sh: |
#!/bin/bash
echo hello world
Then, in my templates, I tried to use that value for the defaultMode of a volume. Here's the code:
File: templates/deployment.yaml
{{- if .Values.customScripts }}
- name: custom-scripts
configMap:
name: {{ include "airflow.fullname" . }}-custom-scripts
defaultMode: {{ .Values.customScriptDefaultMode }}
{{- end }}
When I ran helm template .
to render the template, I expected to see 0777
. However, what I got was 511
. Here's the relevant part of the output:
---
volumes:
- name: airflow-config
configMap:
name: airflow
- name: custom-scripts
configMap:
name: airflow-custom-scripts
defaultMode: 511
My expectation was:
---
volumes:
- name: airflow-config
configMap:
name: airflow
- name: custom-scripts
configMap:
name: airflow-custom-scripts
defaultMode: 0777
Naturally, I was confused and frustrated. I searched the internet for an explanation and found a Stack Overflow post that shed some light on the issue. According to one of the answers, if an argument is a string and starts with "0x"
, "0b"
, or "0"
, it is interpreted as a hexadecimal, binary, or octal string, respectively.
So, in my case, "0777"
is being treated as an octal string. And since "0777"
in octal is equivalent to "511"
in decimal, that's what we get.
But here's the catch: if we put 0777
in single quotes ('0777'
), it will be treated as a string, not a number. And that can cause issues because the defaultMode
in Kubernetes specs must be a number.
ValidationError(Deployment.spec.template.spec.volumes[1].configMap.defaultMode): invalid type for io.k8s.api.core.v1.ConfigMapVolumeSource.defaultMode: got "string", expected "integer"
So, the correct way to set the defaultMode
in Helm templates is to use double quotes ("0777"
). This way, it will be treated as a number, not a string 🤯.
# Wrong 🛑
customScriptDefaultMode: 0777
# Wrong 🛑
customScriptDefaultMode: '0777'
# Correct ✅
customScriptDefaultMode: "0777"