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=foo
lugar y la variable se pasará adocker run
como una variable de entorno, haciendo quedocker run -e PASSWORD
funcione.Puede pasar usando
-e
pará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 run
con--env-file
como 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--env
sus valores env, se citarán / escaparán con la semántica estándar de cualquier shell que esté usando, pero cuando use--env-file
los 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--env
entradas 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.yml
archivo, 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.yml
archivo, 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-compose
construir imágenes. Esto es útil cuando elDockerfile
RUN
comando debe ejecutar comandos específicos para el entorno.(su shell
RAILS_ENV=development
ya existe en el entorno)docker-compose.yml :
Dockerfile :
De esta manera yo no necesidad de especificar las variables de entorno en archivos o
docker-compose
build
/up
comandos:fuente
Use el
-e
valor 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
-e
indicador.Ejemplo:
Si necesita configurar muchas variables, use la
--env-file
banderaPor 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?-e
argumentos 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.sh
localmente 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
source
es un comando bash), obtiene elenv.sh
archivo (que establece las variables de entorno) y ejecuta el archivo jar.Se
env.sh
ve así,Agregué el
printenv
comando 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-file
argumento a undocker run
comando. 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 run
comando . En tal caso, podría tener un script que descifre las variables env usando say, KMS, y las agregue a lasenv.sh
que se pueden obtener para establecer las variables env..
comando POSIX (punto) disponible en forma regular ensh
lugar desource
. (source
es 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" ubuntu
luego dentro de ese contenedor:root@947c89c79397:/# echo $HE root@947c89c79397:/#
.... LaHE
variable 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.env
y pasarlos a Docker, sin que nada se almacene de forma insegura (por lo que no puede simplemente mirardocker history
y tomar las teclas.Digamos que tiene un montón de cosas de AWS en su
.env
gusto, 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