Usando o CoreOS, o Docker e o systemd para gerenciar meus serviços, quero executar adequadamente a descoberta de serviços. Como o CoreOS utiliza o etcd (valor-chave distribuído), existe uma maneira muito conveniente de fazer isso. No ExecStartPost do systemd eu posso apenas inserir o serviço iniciado no etcd sem problemas. Meu usecase precisa de algo assim:
ExecStartPost=/usr/bin/etcdctl set /services/myServiceName '{ \"host\": \"%H\", \"port\": 5555 }'
que funciona como um encanto.
Mas é aí que minha ideia apareceu. O Docker tem o poder de atribuir aleatoriamente uma porta se eu executar apenas docker run -p 5555
, o que é incrível, pois não preciso configurá-la estaticamente no arquivo * .service e possivelmente executar várias instâncias no mesmo host. E se eu pudesse obter a porta atribuída aleatoriamente e inserir em vez da estática 5555
?
Acontece que eu posso usar o comando docker port
para obter a porta e com alguma formatação podemos obter apenas a porta com
$(echo $(/usr/bin/docker port my-container-name 5555) | cut -d':' -f2)
que funciona se eu configurá-lo (usando o bash) assim:
/usr/bin/etcdctl set /services/myServiceName '{ \"host\": \"%H\", \"port\": '$(echo $(/usr/bin/docker port my-container-name 5555) | cut -d':' -f2)' }'
mas usando systemd eu simplesmente não consigo fazer funcionar. Este é o código que estou usando:
ExecStartPost=/usr/bin/etcdctl set /services/myServiceName '{ \"host\": \"%H\", \"port\": '$(echo $(/usr/bin/docker port my-container-name 5555) | cut -d':' -f2)'}'
De alguma forma, eu entendi algo errado, mas é difícil depurar, já que funciona quando digitado no terminal.