Eu gostaria de poder usar variáveis env dentro do docker-compose.yml, com valores passados no momento do docker-compose up. Este é o exemplo. Eu estou fazendo isso hoje com o comando básico docker run, que está envolvido em meu próprio script. Existe uma maneira de conseguir isso com a composição, sem esses invólucros de bash?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
docker
docker-compose
Dmitry z
fonte
fonte
Respostas:
template.yml
, qual é a suadocker-compose.yml
variável de ambiente.Um novo arquivo
docker-compose.yml
será gerado com os valores corretos das variáveis de ambiente.Arquivo template.yml de amostra:
Arquivo env.sh de amostra:
fonte
A solução DOCKER:
Parece que o docker-compose 1.5+ ativou a substituição de variáveis: https://github.com/docker/compose/releases
O último Docker Compose permite acessar variáveis de ambiente do seu arquivo de composição. Assim, você pode originar suas variáveis de ambiente e executar o Compose da seguinte maneira:
Em seguida, você pode fazer referência às variáveis no docker-compose.yml usando $ {VARIABLE}, da seguinte maneira:
E aqui estão mais informações dos documentos, obtidas aqui: https://docs.docker.com/compose/compose-file/#variable-substitution
E acredito que esse recurso foi adicionado a esta solicitação de recebimento : https://github.com/docker/compose/pull/1765
A solução BASH:
Percebo que as pessoas têm problemas com o suporte a variáveis de ambiente do Docker. Em vez de lidar com variáveis de ambiente no Docker, vamos voltar ao básico, como o bash! Aqui está um método mais flexível usando um script bash e um
.env
arquivo.Um arquivo .env de exemplo:
em seguida, execute este script bash no mesmo diretório, que deve implantar tudo corretamente:
Basta referenciar suas variáveis env no seu arquivo de composição com a sintaxe bash usual (ou seja,
${SECRET_KEY}
para inserir aSECRET_KEY
do.env
arquivo).Observe que o arquivo
COMPOSE_CONFIG
é definido no meu.env
arquivo e usado no meu script bash, mas você pode facilmente substituí{$COMPOSE_CONFIG}
-lo pelomy-compose-file.yml
script bash.Observe também que eu rotulei essa implantação nomeando todos os meus contêineres com o prefixo "myproject". Você pode usar qualquer nome que desejar, mas ajuda a identificar seus contêineres, para que você possa referenciá-los facilmente mais tarde. Supondo que seus contêineres sejam sem estado, como deveriam ser, esse script removerá e reimplementará rapidamente seus contêineres de acordo com os parâmetros de arquivo .env e seu arquivo YAML de composição.
Atualização Como essa resposta parece bastante popular, escrevi uma postagem no blog que descreve meu fluxo de trabalho de implantação do Docker com mais profundidade: http://lukeswart.net/2016/03/lets-deploy-part-1/ Isso pode ser útil quando você adiciona mais complexidade em uma configuração de implantação, como configurações nginx, certificados LetsEncrypt e contêineres vinculados.
fonte
grep foo file.text
vez decat file.text | grep foo
. No meu caso eu tive queexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
.docker-compose up
e não comdocker-compose run
..env
subenv_file
. Em seguida, você pode fazer referência às variáveis emdocker-compose.yml
usando${VARIABLE}
Parece que o docker-compose agora possui suporte nativo para variáveis de ambiente padrão no arquivo .
tudo o que você precisa fazer é declarar suas variáveis em um arquivo chamado
.env
e elas estarão disponíveis no docker-compose.yml.Por exemplo, para
.env
arquivo com conteúdo:Você pode acessar sua variável dentro
docker-compose.yml
ou encaminhá-la para o contêiner:fonte
.env
, por exemploconfig.env
, não funcionou para mim.O seguinte é aplicável ao conjunto de encaixe 3.x Definir variáveis de ambiente dentro do contêiner
Crie um arquivo .env no mesmo local que o docker-compose.yml
e seu arquivo de composição será como
fonte
fonte
Ao usar variáveis de ambiente para volumes, você precisa:
crie o arquivo .env na mesma pasta que contém o
docker-compose.yaml
arquivodeclarar variável no
.env
arquivo:Mude
$hostname
para${HOSTNAME}
atdocker-compose.yaml
fileClaro que você pode fazer isso dinamicamente em cada compilação, como:
fonte
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.
A melhor maneira é especificar variáveis de ambiente fora do
docker-compose.yml
arquivo. Você pode usarenv_file
configuração e definir seu arquivo de ambiente na mesma linha. Em seguida, fazer uma composição do docker novamente deve recriar os contêineres com as novas variáveis de ambiente.Aqui está como meu docker-compose.yml se parece:
fonte
Você não pode ... ainda. Mas essa é uma alternativa, pense como um gerador docker-composer.yml:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
Basicamente, um script de shell que substituirá suas variáveis. Além disso, você pode usar a tarefa Grunt para criar seu arquivo de composição do Docker no final do processo de IC.
fonte
Eu tenho um script bash simples que criei para isso, apenas significa executá-lo em seu arquivo antes de usar: https://github.com/antonosmond/subber
Basicamente, basta criar seu arquivo de composição usando chaves duplas para indicar variáveis de ambiente, por exemplo:
Qualquer coisa entre chaves duplas será substituída pela variável de ambiente com o mesmo nome; portanto, se eu tivesse as seguintes variáveis de ambiente definidas:
na execução
subber docker-compose.yml
do arquivo resultante seria semelhante a:fonte
Até onde eu sei, este é um trabalho em andamento. Eles querem fazer isso, mas ainda não foi lançado. Veja 1377 (o "novo" 495 mencionado por @Andy).
Acabei implementando a abordagem "generate .yml como parte do IC", como proposto por @Thomas.
fonte
adicionar env ao arquivo .env
Tal como
salve-o em
deploy.sh
fonte
Use o arquivo .env para definir valores dinâmicos no docker-compse.yml. Seja porta ou qualquer outro valor.
Exemplo de doca-composição:
Dentro do arquivo .env, você pode definir o valor dessas variáveis:
fonte
Use a versão 3.6:
Eu consegui este link https://github.com/docker/cli/issues/939
fonte
Desde 1.25.4, o docker-compose suporta a opção
--env-file
que permite especificar um arquivo contendo variáveis.O seu deve ficar assim:
E o comando:
fonte