Dockerfile中的“ip route”命令生成错误

我创build一个像这样的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"] 

我看到他们在构build过程中被执行: Logstash容器的构建

但是容器无法启动。 sudo docker logs logstash-collector-01告诉我: RTNETLINK的答案:文件存在

如果我发出第二个ip route命令而不发出第一个命令(如果一个已经在其活动路由表中,那么Linux不会添加一个路由)。 但是,这怎么可能呢? 我的Dockerfile的CMD命令是否按顺序处理?

这是因为您只能为每个dockerfile指定一个CMD。

CMD是容器将运行的东西(通常是logstash,一个长期运行的守护进程),所以你在做什么只是运行最后一个CMD。

请参阅https://stackoverflow.com/questions/23692470/why-cant-i-use-docker-cmd-multiple-times-to-run-multiple-services#23693804

您可以考虑使用单个容器的networking来共享nginx和logstash代理之间的lo-fi解决scheme,但是您需要跟踪端口。

更高的链条是像kubernetes这样的事情更容易的解决scheme。

在这之间,你可以查看领事(/ SkyDNS)来帮助DNS发现。