Como passo as variáveis de ambiente para os contentores do Docker?

Sou novo no Docker, e não é claro como aceder a uma base de dados externa a partir de um contentor. É a melhor maneira de código-duro na cadeia de conexão?

# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
Author: Peter Mortensen, 2015-05-28

8 answers

Pode passar variáveis de ambiente para os seus contentores com a bandeira -e.

Um exemplo de um programa inicial:

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

Ou, se não quiser ter o valor na linha de comandos onde será apresentado por ps, etc., -e pode puxar o valor do ambiente actual se você apenas dá-lo sem o =:

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

Se você tem muitas variáveis de ambiente e especialmente se elas são destinadas a ser secretas, você pode usar um ficheiro env:

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

A bandeira --env-file toma um nome de ficheiro como argumento e espera que cada linha esteja no formato VAR=VAL, imitando o argumento passado para --env. As linhas de comentários só precisam de ser prefixadas com #

 671
Author: errata, 2016-11-29 00:43:16

Você pode passar usando os parâmetros {[[0]} com o comando docker run .. Como mencionado aqui e como mencionado por @errata.
No entanto, a possível desvantagem desta abordagem é que suas credenciais serão exibidas na listagem do processo, onde você executá-lo.
Para torná-lo mais seguro, você pode escrever suas credenciais em um arquivo de configuração e fazer docker run com --env-file Como mencionado Aqui. Então você pode controlar o acesso desse arquivo de configuração para que outros tenham acesso a essa máquina não vi as suas credenciais.

 69
Author: Sabin, 2018-03-19 18:12:27

Se está a usar a 'composição do acoplador' como método para rodar o(s) Seu (s) contentor (es), existe de facto uma forma útil de passar uma variável de ambiente definida no seu servidor para o contentor do acoplador.

No seu ficheiro, digamos que está a criar um contentor básico de hapi-js e o código parece:
hapi_server:
  container_name: hapi_server
  image: node_image
  expose:
    - "3000"
Vamos dizer que o servidor local onde o seu projecto de acoplagem está tem uma variável de ambiente chamada 'NODE_DB_CONNECT' que você quer passar para o seu container hapi-js, e quer que o seu novo nome seja "HAPI_DB_CONNECT". Em seguida, no Arquivo docker-compose.yml, você iria passar a variável de ambiente local para o container e renomeá-lo assim:
hapi_server:
  container_name: hapi_server
  image: node_image
  environment:
    - HAPI_DB_CONNECT=${NODE_DB_CONNECT}
  expose:
    - "3000"

Espero que isto o ajude a evitar codificar um texto de ligação à base de dados em qualquer ficheiro do seu contentor!

 36
Author: Marquistador, 2017-05-26 03:45:00

Usar -e ou o valor --env para definir variáveis de ambiente (por omissão []).

Um exemplo de um programa inicial:

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

Se quiser usar vários ambientes da linha de comandos, então antes de cada variável de ambiente use a opção -e.

Exemplo:

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

Nota: Certifique-se de colocar o nome do contentor após a variável de ambiente, não antes disso.

Se precisar de configurar muitas variáveis, use o --env-file Bandeira

Por exemplo,

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

Para qualquer outra ajuda, veja a ajuda do acoplador:

 $ docker run --help

Documentação oficial: https://docs.docker.com/compose/environment-variables/

 13
Author: Vishnu Mishra, 2017-05-25 20:28:46

Usando docker-compose, o exemplo abaixo mostra como pode herdar as variáveis da shell env dentro de ambos os componentes do acoplador.yml e, por sua vez, Qualquer(s) ficheiro (s) do Dockerfile chamado (S) por docker-compose para criar imagens. Achei isto útil se dissesse no Dockerfile RUN comando que eu preciso executar comandos específicos para o ambiente.

(a sua concha já existe no ambiente)

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}

Ficheiro 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
Por aqui eu não é necessário especificar as variáveis de ambiente nos ficheiros ou docker-compose build/up comandos:
docker-compose build
docker-compose up
 13
Author: joshweir, 2017-10-05 01:48:45

Para a Amazon AWS ECS / ECS, você deve gerir as suas variáveis de ambiente (especialmente segredos) através de um balde S3 privado. Ver publicação no blogComo gerir segredos para aplicações baseadas no serviço de contêineres Amazon EC2 usando a Amazon S3 e a Docker.

 3
Author: Joseph Juhnke, 2017-05-25 20:31:15
Uma outra maneira é usar os poderes do /usr/bin/env:
docker run ubuntu env DEBUG=1 path/to/script.sh
 2
Author: sanmai, 2018-04-17 02:08:52

Se tiver as variáveis de ambiente num env.sh localmente e quiser configurá-las quando o contentor começar, pode tentar

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

Este comando iria iniciar o contentor com uma linha de comandos bash (quero uma linha de comandos bash, uma vez que source é um comando bash), obtém o ficheiro env.sh (que define as variáveis de ambiente) e executa o ficheiro jar.

O env.sh parece-se com isto,

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

Adicionei o comando printenv apenas para testar se o comando de origem funciona. Provavelmente devias. remova-o quando confirmar que o comando de código funciona bem ou que as variáveis de ambiente aparecerão nos seus registos de docker.

 1
Author: akilesh raj, 2018-03-23 08:53:23