AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 835262
Accepted
armani
armani
Asked: 2017-02-28 13:29:31 +0800 CST2017-02-28 13:29:31 +0800 CST 2017-02-28 13:29:31 +0800 CST

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

  • 772

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

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

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

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

linux networking docker
  • 1 1 个回答
  • 1514 Views

1 个回答

  • Voted
  1. Best Answer
    iwaseatenbyagrue
    2017-02-28T15:29:22+08:002017-02-28T15:29:22+08:00

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

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

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

    您可以考虑使用 lo-fi 解决方案,例如使用单个容器的网络在 nginx 和 logstash 代理之间共享,但是您需要跟踪端口。

    更高的链条是像 kubernetes 这样的解决方案,它们使这种事情变得更容易。

    在这两者之间,您可能会查看 consul(/SkyDNS) 以帮助进行 DNS 发现。

    • 4

相关问题

  • 更改 PHP 的默认配置设置?

  • 有什么软件可以模拟局域网?

  • 保护新的 Ubuntu 服务器 [关闭]

  • 带宽利用工具?[关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve