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


1

我目前正在尝试获取动态端口,以便可以在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失败。任何帮助将不胜感激,我很沮丧!

Answers:


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"

您可能可以将其改编成只做端口。


0

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

它显示什么错误?


他在ExecStartPost命令外壳中,因此$PATH可用,该docker命令不必是绝对的。
Andy Shinn 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.