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?