J'ai un fichier unitaire assez simple pour un service d'accompagnement de découverte pour une instance de serveur que j'exécute sur CoreOS. Le fichier d'unité ressemble à ceci:
[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
Cela fonctionne bien, mais il m'a fallu beaucoup de temps pour arriver à ce stade, car si je change la etcdctl
ligne en ceci:
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Ensuite, cela ne fonctionne pas - il finit par définir une valeur comme 100.45.218.3:
, sans port. En cours de route, j'ai passé beaucoup de temps à jouer avec différentes utilisations de la $PORT
variable, et je ne sais pas pourquoi la configuration sur laquelle j'ai opté fonctionne. À un moment donné, j'avais ceci dans le script:
echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \
Et obtenu des journaux de journal comme celui-ci:
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
Essentiellement, ma question est: que se passe-t-il ici? Cela va à l'encontre de ma compréhension {}
du travail dans les scripts bash. Et pourquoi puis-je utiliser des curlies sur la COREOS_PRIVATE_IPV4
variable (qui est exportée depuis /etc/environment
, mais pas pour PORT
?
si le contenu de PORT provient d'une autre variable bash avec laquelle vous auriez affaire,
indirect reference
veuillez essayer:Je suppose que vous êtes sûr que votre coquille est Bash
la source
PORT
provient d'une ligne du scriptexport PORT=$(docker ...);
2. CoreOS est livré avec bash 4.2${!PORT}
dans votre script ??