Eu sou novo no Docker e não está claro como acessar um banco de dados externo a partir de um contêiner. É a melhor maneira de codificar na cadeia de conexão?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
fonte
Eu sou novo no Docker e não está claro como acessar um banco de dados externo a partir de um contêiner. É a melhor maneira de codificar na cadeia de conexão?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
Você pode passar variáveis de ambiente para seus contêineres com o -e
sinalizador
Um exemplo de um script de inicialização:
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 você não quiser ter o valor na linha de comando em que ele será exibido ps
, etc., -e
poderá extrair o valor do ambiente atual se você o fornecer sem o =
:
sudo PASSWORD='foo' docker run [...] -e PASSWORD [...]
Se você possui muitas variáveis de ambiente e, principalmente, se elas são secretas, pode usar um arquivo env :
$ docker run --env-file ./env.list ubuntu bash
O sinalizador --env-file usa um nome de arquivo como argumento e espera que cada linha esteja no formato VAR = VAL, imitando o argumento passado para --env. As linhas de comentário precisam apenas ser prefixadas com #
export PASSWORD=foo
e a variável será passadadocker run
como uma variável de ambiente, fazendo odocker run -e PASSWORD
trabalho.Você pode passar usando
-e
parâmetros com odocker run ..
comando conforme mencionado aqui e como mencionado por @errata.No entanto, a possível desvantagem dessa abordagem é que suas credenciais serão exibidas na lista de processos, onde você a executa.
Para torná-lo mais seguro, você pode escrever as suas credenciais em um arquivo de configuração e fazer
docker run
com--env-file
como mencionado aqui . Em seguida, você pode controlar o acesso desse arquivo de configuração para que outras pessoas que tenham acesso a essa máquina não vejam suas credenciais.fonte
--env-file
, quando você usar--env
seus valores env serão citados / escapados com semântica padrão de qualquer shell que estiver usando, mas ao usar--env-file
os valores que você obterá dentro de seu contêiner será diferente. O comando docker run apenas lê o arquivo, faz uma análise muito básica e passa os valores para o contêiner, não é equivalente à maneira como seu shell se comporta. Apenas um pequeno detalhe para você saber se está convertendo várias--env
entradas para um--env-file
.Se você estiver usando 'docker-compose' como o método para girar seus contêineres, na verdade, há uma maneira útil de passar uma variável de ambiente definida em seu servidor para o contêiner Docker.
No seu
docker-compose.yml
arquivo, digamos que você esteja criando um contêiner hapi-js básico e o código se pareça com:Digamos que o servidor local em que o seu projeto de docker esteja possui uma variável de ambiente chamada 'NODE_DB_CONNECT' que você deseja passar para o contêiner hapi-js e que o novo nome seja 'HAPI_DB_CONNECT'. Em seguida, no
docker-compose.yml
arquivo, você passaria a variável de ambiente local para o contêiner e a renomearia da seguinte maneira:Espero que isso ajude você a evitar codificar permanentemente uma string de conexão com o banco de dados em qualquer arquivo do seu contêiner!
fonte
Usando
docker-compose
, você pode herdar variáveis env no docker-compose.yml e, posteriormente, qualquer Dockerfile (s) chamado (s) pordocker-compose
para criar imagens. Isso é útil quando oDockerfile
RUN
comando deve executar comandos específicos para o ambiente.(seu shell
RAILS_ENV=development
já existe no ambiente)docker-compose.yml :
Dockerfile :
Dessa forma, não preciso especificar variáveis de ambiente em arquivos ou
docker-compose
build
/up
comandos:fonte
Use
-e
ou --env value para definir variáveis de ambiente (padrão []).Um exemplo de um script de inicialização:
Se você deseja usar vários ambientes na linha de comando, antes de cada variável de ambiente, use o
-e
sinalizadorExemplo:
Se você precisar configurar muitas variáveis, use o
--env-file
sinalizadorPor exemplo,
Para qualquer outra ajuda, consulte a ajuda do Docker:
Documentação oficial: https://docs.docker.com/compose/environment-variables/
fonte
ubuntu bash
? Aplica-se a imagens criadas com o ubuntu como imagem base ou a todas as imagens?-e
argumentos atrás! Eu não posso nem começar a entender por que eles fizeram isso necessário ...Há um truque interessante de como canalizar variáveis de ambiente da máquina host para um contêiner de docker:
fonte
Para o Amazon AWS ECS / ECR, você deve gerenciar suas variáveis de ambiente ( especialmente segredos ) por meio de um bucket S3 privado. Consulte a publicação no blog Como gerenciar segredos para aplicativos baseados no Amazon EC2 Container Service usando o Amazon S3 e o Docker .
fonte
Outra maneira é usar os poderes de
/usr/bin/env
:fonte
Se você possui as variáveis de ambiente
env.sh
localmente e deseja configurá-las quando o contêiner é iniciado, tenteEste comando iniciaria o contêiner com um shell bash (eu quero um shell bash, pois
source
é um comando bash), origina oenv.sh
arquivo (que define as variáveis de ambiente) e executa o arquivo jar.Os
env.sh
olhares como este,Eu adicionei o
printenv
comando apenas para testar se o comando de origem real funciona. Você provavelmente deve removê-lo quando confirmar que o comando source funciona bem ou se as variáveis de ambiente apareceriam nos logs do docker.fonte
--env-file
argumento para umdocker run
comando. Por exemplo, se você estiver implantando um aplicativo usando o Google app engine e o aplicativo em execução no contêiner precisar de variáveis de ambiente definidas no contêiner de docker, você não terá uma abordagem direta para definir as variáveis de ambiente, pois não tem controle sobre odocker run
comando . Nesse caso, você pode ter um script que descriptografa as variáveis env usando, digamos, KMS e as adiciona àsenv.sh
quais podem ser originadas para definir as variáveis env..
comando POSIX (ponto) disponível emsh
vez regularsource
. (source
é o mesmo que.
) #Usando jq para converter o env em JSON:
isso requer jq versão 1.6 ou mais recente
isso coloca o host env como json, essencialmente como no Dockerfile:
fonte
docker run -e HOST_ENV="$env_as_json" <image>
? : ? No meu caso, o Docker não parece resolver variáveis ou subshells (${}
ou$()
) quando passados como argumentos do docker. Por exemplo:A=123 docker run --rm -it -e HE="$A" ubuntu
então dentro desse contêiner:root@947c89c79397:/# echo $HE root@947c89c79397:/#
.... AHE
variável não faz isso.também podemos hospedar variáveis de ambiente da máquina usando -e flag e $:
Antes de executar, é necessário exportar (significa definir) a variável e o arquivo env locais ou imediatamente antes de usar
Usando esse método, defina a variável env automaticamente com o seu nome no meu caso (MG_HOST, MG_USER)
Adicional:
Se você estiver usando python, poderá acessar essas variáveis de ambiente na janela de encaixe,
fonte
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
É uma maneira de receber os dados armazenados em um.env
e transmiti-los ao Docker, sem que nada seja armazenado de maneira insegura (para que você não possa apenas olhardocker history
e pegar as chaves.Digamos que você tenha um monte de coisas da AWS da
.env
mesma forma:A execução do docker com o `` docker run --rm -it --env-file <(bash -c 'env | grep AWS_') agarra tudo e passa-o com segurança para ser acessível a partir do contêiner.
fonte