CoreOS Fleet Unit 文件和 Docker 动态端口问题

CoreOS Fleet Unit 文件和 Docker 动态端口问题

我目前正在尝试获取动态端口,以便可以在 CoreOS 上将其注册到 etcd。事实证明这非常困难。

这是我的单位文件

[Unit]
Description=test Elastic Search Server
After=docker.service
Requires=docker.service

[Service]
User=core
ExecStartPre=/usr/bin/docker pull shizzle/elasticsearch-server
ExecStart=/bin/bash -c '/usr/bin/docker start -a %n || /usr/bin/docker run --name="%n" -p :9200 -p :9300 shizzle/elasticsearch-server /elasticsearch/bin/elasticsearch -Des.config=/etc/elasticsearch.yml'
ExecStartPost=-/usr/bin/etcdctl mkdir /%n
ExecStartPost=/usr/bin/etcdctl set /%n/host %H
ExecStartPost=/bin/bash -c "/usr/bin/etcdctl set /%n/port $(docker inspect --format='{{(index (index .NetworkSettings.Ports "9200/tcp") 0).HostPort}}' %n)"
ExecStop=/usr/bin/docker stop /%n
ExecStopPost=/usr/bin/etcdctl rm /%n

不幸的是,第三个 ExecStartPost 失败了。任何帮助我都会非常感激,我被难住了!

答案1

为什么不使用主机级注册服务将带有端口的容器注册到 etcd?例如https://github.com/progrium/registrator也许能够完成您在 shell 中尝试执行的操作。除此之外,我已使用类似以下方法在 CoreOS 中成功注册 IP 和端口对:

ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' %n); while netstat -lnt | grep :$port >/dev/null; do etcdctl set /app/upstream/%n $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"

您也许能够调整它以仅执行端口。

答案2

您没有使用 docker 二进制文件的绝对路径(/usr/bin/docker),这可能是原因吗?

它打印了什么错误?

相关内容