Ho un file di unità abbastanza semplice per un servizio sidekick di rilevamento per un'istanza del server che sto eseguendo su CoreOS. Il file dell'unità è simile al seguente:
[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
while true; do \
export PORT=$(docker port frontend%i 80 | sed s/.*://); \
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
sleep 45; \
done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i
[X-Fleet]
MachineOf=frontend@%i.service
Funziona bene, ma mi ci sono voluti anni per arrivare a questo stadio, perché se cambio la etcdctl
linea in questo modo:
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Quindi non funziona: finisce per impostare un valore come 100.45.218.3:
, senza porta. Lungo la strada ho trascorso molto tempo a giocare con diversi usi della $PORT
variabile e non ho idea del perché la configurazione su cui mi sono basato funziona. Ad un certo punto ho avuto questo nella sceneggiatura:
echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \
E ho registri del diario come questo:
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi
Aug 17 01:05:07 core-01 bash[53694]: hi
Essenzialmente la mia domanda è: cosa sta succedendo qui? Questo vola di fronte a come ho capito {}
di lavorare negli script bash. E perché posso usare i ricci sulla COREOS_PRIVATE_IPV4
variabile (da cui viene esportato /etc/environment
, ma non per PORT
?