with variable run example create arg docker environment-variables

run - dockerfile environment variables example



¿Cómo paso las variables de entorno a los contenedores Docker? (8)

Soy nuevo en Docker, y no está claro cómo acceder a una base de datos externa desde un contenedor. ¿Es la mejor manera de codificar en la cadena de conexión?

# Dockerfile ENV DATABASE_URL amazon:rds/connection?string


Otra forma es usar los poderes de /usr/bin/env :

docker run ubuntu env DEBUG=1 path/to/script.sh



Puede pasar usando el comando -e con el comando docker run .. como se menciona here y como lo menciona @errata.
Sin embargo, el posible inconveniente de este enfoque es que sus credenciales se mostrarán en el listado de procesos, donde lo ejecute.
Para hacerlo más seguro, puede escribir sus credenciales en un archivo de configuración y docker run --env-file docker run con --env-file como se menciona here . Luego, puede controlar el acceso de ese archivo de configuración para que otras personas que tengan acceso a esa máquina no puedan ver sus credenciales.


Puede pasar variables de entorno a sus contenedores con la bandera -e .

Un ejemplo de un script de inicio:

sudo docker run -d -t -i -e REDIS_NAMESPACE=''staging'' / -e POSTGRES_ENV_POSTGRES_PASSWORD=''foo'' / -e POSTGRES_ENV_POSTGRES_USER=''bar'' / -e POSTGRES_ENV_DB_NAME=''mysite_staging'' / -e POSTGRES_PORT_5432_TCP_ADDR=''docker-db-1.hidden.us-east-1.rds.amazonaws.com'' / -e SITE_URL=''staging.mysite.com'' / -p 80:80 / --link redis:redis / --name container_name dockerhub_id/image_name

O, si no desea tener el valor en la línea de comandos donde se mostrará por ps , etc., -e puede obtener el valor del entorno actual si solo lo da sin el = :

sudo PASSWORD=''foo'' docker run [...] -e PASSWORD [...]

Si tiene muchas variables de entorno y especialmente si están destinadas a ser secretas, puede usar un archivo env :

$ docker run --env-file ./env.list ubuntu bash

La bandera --env-file toma un nombre de archivo como argumento y espera que cada línea esté en formato VAR = VAL, imitando el argumento pasado a --env. Las líneas de comentario solo tienen que estar prefijadas con #


Si está utilizando ''docker-compose'' como método para girar su (s) contenedor (es), en realidad hay una manera útil de pasar una variable de entorno definida en su servidor al contenedor de Docker.

En su archivo docker-compose.yml , digamos que está girando un contenedor básico hapi-js y el código parece:

hapi_server: container_name: hapi_server image: node_image expose: - "3000"

Digamos que el servidor local en el que se encuentra su proyecto de ventana acoplable 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 archivo docker-compose.yml , pasaría la variable de entorno local al contenedor y le cambiaría el nombre de la siguiente manera:

hapi_server: container_name: hapi_server image: node_image environment: - HAPI_DB_CONNECT=${NODE_DB_CONNECT} expose: - "3000"

¡Espero que esto te ayude a evitar la codificación de una cadena de conexión de base de datos en cualquier archivo en tu contenedor!


Si tiene las variables de entorno en un env.sh localmente y desea configurarlo cuando se inicie el contenedor, puede probar

COPY env.sh /env.sh COPY <filename>.jar /<filename>.jar ENTRYPOINT ["/bin/bash" , "-c", "source /env.sh && printenv && java -jar /<filename>.jar"]

Este comando iniciaría el contenedor con un shell bash (quiero un shell bash ya que source es un comando bash), env.sh archivo env.sh (que establece las variables de entorno) y ejecuta el archivo jar.

El env.sh parece a esto,

#!/bin/bash export FOO="BAR" export DB_NAME="DATABASE_NAME"

printenv comando printenv 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 la ventana acoplable.


Usando docker-compose , el ejemplo a continuación muestra cómo puede heredar las variables env de shell dentro de docker-compose.yml y, a su vez, cualquier archivo Docker (s) llamado por docker-compose para construir imágenes. He encontrado esto útil si, por ejemplo, en el Dockerfile RUN Dockerfile , necesito ejecutar comandos específicos para el entorno.

(Su shell tiene RAILS_ENV=development ya existente en el entorno)

docker-compose.yml :

version: ''3.1'' services: my-service: build: #$RAILS_ENV is referencing the shell environment RAILS_ENV variable #and passing it to the Dockerfile ARG RAILS_ENV #the syntax below ensures that the RAILS_ENV arg will default to #production if empty. #note that is dockerfile: is not specified it assumes file name: Dockerfile context: . args: - RAILS_ENV=${RAILS_ENV:-production} environment: - RAILS_ENV=${RAILS_ENV:-production}

Dockerfile :

FROM ruby:2.3.4 #give ARG RAILS_ENV a default value = production ARG RAILS_ENV=production #assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed #by the subsequent RUN call within the container ENV RAILS_ENV $RAILS_ENV #the subsequent RUN call accesses the RAILS_ENV ENV variable within the container RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi

De esta manera no necesito especificar variables de entorno en archivos o comandos de build / up docker-compose :

docker-compose build docker-compose up


Use el valor -e o --env para establecer las variables de entorno (por defecto []).

Un ejemplo de un script de inicio:

docker run -e myhost=''localhost'' -it busybox sh

Si desea utilizar varios entornos desde la línea de comandos, antes de cada variable de entorno use la -e .

Ejemplo:

sudo docker run -d -t -i -e NAMESPACE=''staging'' -e PASSWORD=''foo'' busybox sh

Nota: asegúrese de poner el nombre del contenedor después de la variable de entorno, no antes de eso.

Si necesita configurar muchas variables, use la --env-file

Por ejemplo,

$ docker run --env-file ./my_env ubuntu bash

Para cualquier otra ayuda, consulte la ayuda de Docker:

$ docker run --help

Documentación oficial: https://docs.docker.com/compose/environment-variables/