Me gustaría pasar el contenido de un archivo JSON como una variable de entorno durante la ejecución de la ventana acoplable. La ejecución de la ventana acoplable se inicializa dentro de un archivo de servicio systemd.
Hice algo como:
export TEMP_CONFIG=$(cat /etc/config.json)y ejecute el contenedor docker de la siguiente manera:
docker run \ --env SERVICE_NAME=${CONTAINER_NAME} \ --env TEMP_CONFIG \Pero cuando estoy dentro del contenedor docker e intento hacer eco de la variable ${TEMP_CONFIG} Está vacío.
root@ip-10-109-7-77:/usr/local/nginx/conf# echo ${TEMP_CONFIG} root@ip-10-109-7-77:/usr/local/nginx/conf#¿Hay alguna forma de pasar el contenido de un archivo JSON como variable de entorno?
POR CIERTO:
--env TEMP_CONFIG=$(cat /etc/config.json) \Hacer lo anterior arroja una excepción:
docker: Error parsing reference: "\"conf\"" is not a valid repository/tag.El contenido de config.json es:
{ "conf" : { "appname" : { "dbhost" : "xxxx", "dbname" : "dbname", "dbuser" : "user", "dbpassword" : "xxxxx", "hostname" : "xxxxxx" }, "cacheBaseDir" : "/storage/", "iccprofile" : "/etc/nginx/RGB.V1.0.icc", "tmpDir" : "/tmp", "mdb" : { "user" : "user", "password" : "xxxxx", "rights" : "GlobalAdministrator", "company" : "somecompany" } } }Cualquier ayuda es definitivamente apreciada.
Mencionó que usa el comando docker run en un archivo de unidad systemd. Las opciones systemd ExecStart no se inician en un shell. La sustitución de variables de entorno es compatible con el nombre. También vea la documentación sobre esto:
Se admite la sustitución de variables de entorno básico. Use "
${FOO}" como parte de una palabra, o como una palabra propia, en la línea de comando, en cuyo caso será reemplazada por el valor de la variable de entorno, incluidos todos los espacios en blanco que contiene, lo que dará como resultado una sola argumento.
El documento también dice que StartExec no se ejecuta en un shell:
Esta sintaxis pretende ser muy similar a la sintaxis de shell, pero solo se entienden los metacaracteres y las expansiones que se describen en los siguientes párrafos. Específicamente, no se admite la redirección mediante "<", "<<", ">" y ">>", canalizaciones mediante "|", ejecutar programas en segundo plano mediante "&" y otros elementos de la sintaxis de shell. [...] Tenga en cuenta que las líneas de comando de shell no son compatibles directamente.
Sin embargo, puede usar ExecStart para iniciar un shell y luego pasar un comando usando el indicador -c (aún necesita citar la variable como se menciona en mi respuesta original a continuación):
ExecStart=/bin/bash -c "docker run -e \"TEMP_CONFIG=$(</etc/config.json)\" ..." Su cadena JSON contiene espacios, y sin citar su shell interpretará todo después del primer espacio como argumentos posteriores. Entonces TEMP_CONFIG=$(cat /etc/config.json) es esencialmente equivalente a:
--env TEMP_CONFIG={ "conf" : { "... En este caso, la variable ambiental TEMP_CONFIG tendrá el valor { , y docker run asumirá que "conf" es el siguiente argumento (en este caso, el nombre de la imagen).
Solución: cite sus variables bash:
--env "TEMP_CONFIG=$(cat /etc/config.json)" Además, no uses cat cuando no tengas que hacerlo:
--env "TEMP_CONFIG=$(</etc/config.json)"