Використовуючи CoreOS, Docker та systemd для управління своїми послугами, я хочу належним чином виконувати пошук послуг. Оскільки CoreOS використовує etcd (розподілений ключ-значення), для цього є дуже зручний спосіб. У системі ExecStartPost systemd я можу просто вставити розпочату послугу в etcd без проблем. У моєму шафі потрібно щось подібне:
ExecStartPost=/usr/bin/etcdctl set /services/myServiceName '{ \"host\": \"%H\", \"port\": 5555 }'
що працює як шарм.
Але тут виникла моя ідея. Docker має можливість випадковим чином призначити порт, якщо я просто запускаю, docker run -p 5555
що є приголомшливим, оскільки мені не потрібно встановлювати його статично у файлі * .service, і я можу запустити кілька екземплярів на одному хості. Що робити, якщо я міг отримати випадково призначений порт і вставити замість статичного 5555
?
Виявляється, я можу використовувати docker port
команду, щоб отримати порт, і з деяким форматуванням ми можемо отримати просто порт
$(echo $(/usr/bin/docker port my-container-name 5555) | cut -d':' -f2)
що працює, якщо я встановив його (використовуючи bash) так:
/usr/bin/etcdctl set /services/myServiceName '{ \"host\": \"%H\", \"port\": '$(echo $(/usr/bin/docker port my-container-name 5555) | cut -d':' -f2)' }'
але за допомогою systemd я просто не можу змусити його працювати. Це код, який я використовую:
ExecStartPost=/usr/bin/etcdctl set /services/myServiceName '{ \"host\": \"%H\", \"port\": '$(echo $(/usr/bin/docker port my-container-name 5555) | cut -d':' -f2)'}'
Якось у мене щось не так, але важко налагодити, оскільки він працює під час набору в терміналі.