我创建一个这样的Docker容器:
$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
从那里,我可以将其默认网关更改为nginx容器(用于透明负载平衡):
$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
它可以正常工作,并且一切正常:
$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
但是当我尝试通过将这些命令放在我的〜/ logging / logstash / Dockerfile中来自动执行此操作时,例如:
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"]
但是容器无法启动。 sudo docker logs logstash-collector-01
告诉我:
RTNETLINK答案:文件存在
如果我在ip route
不发出第一个命令的情况下发出第二个命令,则会发生该错误(如果活动路由表中已有一个命令,Linux将不会添加路由)。但是怎么可能呢?我的Dockerfile的CMD命令是否乱序处理?
CMD ["ip","route"...]
vsCMD ip route ...
语法进行了测试。没有效果。