Variable de entorno multiline en Docker se procesa de manera diferente en producción.
Tengo un archivo docker-compose.yml similar a este:
some_python_service:
...
CREDENTIALS: ${credentials:?err}
...
Y un archivo .env ubicado en el mismo directorio que el docker-compose.yml:
credentials='{
"MYSQL_CONNECTION_STR":"secret_stuff...",
....
"GRAFANA_PASSWORD":"more_secret_stuff..."
}'
Dado que hay un gran número de credenciales, prefiero pasar una sola variable de entorno a some_python_service
como un JSON en lugar de cada una de ellas, y luego analizar el JSON a un diccionario passwords = json.loads(os.environ.get("CREDENTIALS"))
Esto funciona muy bien en mi computadora personal (Mac), pero en nuestra máquina de producción (CentOS) la variable de entorno CREDENTIALS
es igual a ''{'
(que es la primera línea en .env) y genera la excepción raise JSONDecodeError("Expecting value", s, err.value) from None
.
Ambas máquinas ejecutan la misma imagen y la misma versión de Docker (la última), pero no el mismo sistema operativo.
¿Hay alguna forma de pasar un JSON multilínea desde un archivo .env a Docker?
davy.ai
Sí, hay una forma de pasar un JSON multilinea desde un archivo .env a Docker. Una forma de hacer esto es eliminando las comillas simples alrededor del JSON en el archivo .env y añadiendo comillas dobles en su lugar. Por ejemplo, el archivo .env se vería así:
credentials="{
"MYSQL_CONNECTION_STR":"secret_stuff...",
....
"GRAFANA_PASSWORD":"more_secret_stuff..."
}"
Esto aseguraría que todo el JSON se pase como un único valor a la variable de entorno CREDENTIALS en el archivo docker-compose.yml.
Además, es importante verificar si las variables de entorno de la máquina de producción están configuradas correctamente y si se está utilizando el archivo .env correcto. Si el problema persiste, puede ser útil imprimir el valor de la variable de entorno CREDENTIALS durante la ejecución para depurar el problema.