“ip route” Comandos no Dockerfile Gerar erro

2

Eu criei um contêiner do Docker assim:

$sudo docker build -t "logstash-collector" ~/logging/logstash/

$sudo docker run -d \
--user=root \
--name="logstash-collector-01" \
--net=logging \
--cap-add=NET_ADMIN \
logstash-collector

E a partir daí, posso alterar seu gateway padrão para um contêiner nginx (para balanceamento de carga transparente):

$sudo docker exec -it logstash-collector-01 ip route delete default
$sudo docker exec -it logstash-collector-01 ip route add default via 172.18.0.10

E funciona, e está tudo bem:

$sudo docker exec -it logstash-collector-01 ip route 
default via 172.18.0.10 dev eth0 
172.18.0.0/16 dev eth0  proto kernel  scope link  src 172.18.0.3 

Mas quando tento automatizar isso, coloco esses comandos em meu ~ / logging / logstash / Dockerfile como:

FROM logstash
COPY logstash.conf /usr/local/share
CMD ["-f", "/usr/local/share/logstash.conf", "--config.reload.automatic"]
CMD ["ip", "route", "delete", "default"]
CMD ["ip", "route", "add", "default", "via", "172.18.0.10"]

Eu os vejo sendo executados durante a compilação:

Mas o contêiner não inicia. sudo docker logs logstash-collector-01 me diz: RTNETLINK responde: Arquivo existe

Esse erro acontece se eu emitir o segundo comando ip route sem emitir o primeiro (o Linux não adicionará uma rota se uma já estiver em sua tabela de roteamento ativa). Mas como isso pode ser? Os comandos CMD do meu Dockerfile estão sendo processados fora de ordem?

    
por armani 27.02.2017 / 22:29

1 resposta

3

Isso porque você só pode especificar um CMD por arquivo docker.

O CMD é o que o contêiner estará executando (o que normalmente seria logstash, um processo demônico de longa execução), então o que você está fazendo é somente executando o último CMD.

Veja link

Você poderia considerar uma solução lo-fi como usar a rede de um único contêiner para compartilhar entre o nginx e os agentes do logstash, mas você precisa manter o controle das portas.

No topo da cadeia estão soluções como o kubernetes que facilitam esse tipo de coisa.

Nesse meio tempo, você pode procurar o cônsul (/ SkyDNS) para ajudar na descoberta de DNS.

    
por 28.02.2017 / 00:29