В настоящее время я пытаюсь получить динамический порт, чтобы зарегистрировать его в etcd в CoreOS. Это оказывается очень сложно.
Вот мой файл модуля
[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 не работает. Любая помощь будет принята с благодарностью, я в тупике!
Почему бы не использовать службу регистрации на уровне хоста для регистрации контейнеров с портами в etcd? Что-то вроде https://github.com/progrium/registrator может делать то, что вы пытаетесь сделать в оболочке. Если не считать этого, мне удалось зарегистрировать пары IP и портов в CoreOS, используя что-то вроде этого:
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"
Возможно, вы сможете адаптировать это, чтобы просто сделать порт.
Вы не используете абсолютный путь для двоичного файла докера (/ usr / bin / docker), может ли это быть причиной?
Какую ошибку выводит?