Soy nuevo en Docker y no está claro cómo acceder a una base de datos externa desde un contenedor. ¿Es la mejor forma de codificar en la cadena de conexión?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
docker
environment-variables
dockerfile
AJcodez
fuente
fuente

export PASSWORD=foolugar y la variable se pasará adocker runcomo una variable de entorno, haciendo quedocker run -e PASSWORDfuncione.Puede pasar usando
-eparámetros con eldocker run ..comando como se menciona aquí y como lo menciona @errata.Sin embargo, la posible desventaja de este enfoque es que sus credenciales se mostrarán en la lista de procesos, donde la ejecuta.
Para hacerlo más seguro, puede escribir sus credenciales en un archivo de configuración y hacer
docker runcon--env-filecomo se ha mencionado aquí . Luego puede controlar el acceso a ese archivo de configuración para que otras personas que tengan acceso a esa máquina no vean sus credenciales.fuente
--env-file, cuando use--envsus valores env, se citarán / escaparán con la semántica estándar de cualquier shell que esté usando, pero cuando use--env-filelos valores que obtendrá dentro de su contenedor serán diferentes. El comando docker run simplemente lee el archivo, realiza un análisis muy básico y pasa los valores al contenedor, no es equivalente al comportamiento de su shell. Solo un pequeño problema para tener en cuenta si está convirtiendo un montón de--enventradas a un--env-file.Si está utilizando 'docker-compose' como método para hacer girar sus contenedores, en realidad hay una forma útil de pasar una variable de entorno definida en su servidor al contenedor Docker.
En su
docker-compose.ymlarchivo, supongamos que está girando un contenedor básico de hapi-js y el código se ve así:Supongamos que el servidor local en el que se encuentra su proyecto de Docker tiene una variable de entorno llamada 'NODE_DB_CONNECT' que desea pasar a su contenedor hapi-js y desea que su nuevo nombre sea 'HAPI_DB_CONNECT'. Luego, en el
docker-compose.ymlarchivo, debe pasar la variable de entorno local al contenedor y cambiarle el nombre de esta manera:¡Espero que esto te ayude a evitar codificar una cadena de conexión de base de datos en cualquier archivo de tu contenedor!
fuente
Utilizando
docker-compose, puede heredar variables env en docker-compose.yml y, posteriormente, cualquier Dockerfile (s) llamado pordocker-composeconstruir imágenes. Esto es útil cuando elDockerfileRUNcomando debe ejecutar comandos específicos para el entorno.(su shell
RAILS_ENV=developmentya existe en el entorno)docker-compose.yml :
Dockerfile :
De esta manera yo no necesidad de especificar las variables de entorno en archivos o
docker-composebuild/upcomandos:fuente
Use el
-evalor o --env para establecer variables de entorno (predeterminado []).Un ejemplo de un script de inicio:
Si desea utilizar múltiples entornos desde la línea de comando, antes de cada variable de entorno utilice el
-eindicador.Ejemplo:
Si necesita configurar muchas variables, use la
--env-filebanderaPor ejemplo,
Para cualquier otra ayuda, consulte la ayuda de Docker:
Documentación oficial: https://docs.docker.com/compose/environment-variables/
fuente
ubuntu bash? ¿Aplica para imágenes creadas con ubuntu como imagen base o para cada imagen?-eargumentos de hace años! Ni siquiera puedo empezar a entender por qué hicieron que esto fuera necesario ...Hay un buen truco para canalizar las variables de entorno de la máquina host a un contenedor acoplable:
fuente
Para Amazon AWS ECS / ECR, debe administrar sus variables de entorno ( especialmente los secretos ) a través de un depósito privado S3. Consulte la publicación del blog Cómo administrar secretos para aplicaciones basadas en Amazon EC2 Container Service mediante Amazon S3 y Docker .
fuente
Otra forma es usar los poderes de
/usr/bin/env:fuente
Si tiene las variables de entorno
env.shlocalmente y desea configurarlo cuando se inicia el contenedor, puede intentarEste comando iniciaría el contenedor con un shell bash (quiero un shell bash ya que
sourcees un comando bash), obtiene elenv.sharchivo (que establece las variables de entorno) y ejecuta el archivo jar.Se
env.shve así,Agregué el
printenvcomando solo para probar que el comando fuente real funciona. Probablemente debería eliminarlo cuando confirme que el comando de origen funciona bien o las variables de entorno aparecerían en los registros de su ventana acoplable.fuente
--env-fileargumento a undocker runcomando. Por ejemplo, si está implementando una aplicación utilizando el motor de aplicaciones de Google y la aplicación que se ejecuta dentro del contenedor necesita variables de entorno establecidas dentro del contenedor de docker, no tiene un enfoque directo para establecer las variables de entorno ya que no tiene control sobre eldocker runcomando . En tal caso, podría tener un script que descifre las variables env usando say, KMS, y las agregue a lasenv.shque se pueden obtener para establecer las variables env..comando POSIX (punto) disponible en forma regular enshlugar desource. (sourcees lo mismo que.)Usando jq para convertir el env a JSON:
esto requiere jq versión 1.6 o posterior
esto empuja al host host como json, esencialmente así en Dockerfile:
fuente
docker run -e HOST_ENV="$env_as_json" <image>? : En mi caso, Docker no parece resolver variables o subcapas (${}o$()) cuando se pasa como argumentos de Docker . Por ejemplo:A=123 docker run --rm -it -e HE="$A" ubuntuluego dentro de ese contenedor:root@947c89c79397:/# echo $HE root@947c89c79397:/#.... LaHEvariable no lo hace.también podemos hospedar la variable de entorno de la máquina usando -e flag y $:
Antes de ejecutar, necesita exportar (significa conjunto) la variable y archivo env local o justo antes de usar
Al usar este método, establezca la variable env automáticamente con su nombre de pila en mi caso (MG_HOST, MG_USER)
Adicional:
Si está utilizando Python, puede acceder a estas variables de entorno dentro de Docker al
fuente
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')Es una forma de recopilar los datos almacenados dentro de a.envy pasarlos a Docker, sin que nada se almacene de forma insegura (por lo que no puede simplemente mirardocker historyy tomar las teclas.Digamos que tiene un montón de cosas de AWS en su
.envgusto, así:ejecutando docker con `` docker run --rm -it --env-file <(bash -c 'env | grep AWS_') lo tomará todo y lo pasará de forma segura para que sea accesible desde dentro del contenedor.
fuente