Tôi có một tệp đơn vị khá đơn giản cho dịch vụ phát hiện phụ cho một phiên bản máy chủ mà tôi đang chạy trên CoreOS. Tệp đơn vị trông như thế này:
[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
Điều này hoạt động tốt, nhưng tôi phải mất nhiều thời gian để đến giai đoạn này, bởi vì nếu tôi thay đổi etcdctl
dòng này:
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Sau đó, nó không hoạt động - cuối cùng nó thiết lập một giá trị như 100.45.218.3:
, không có cổng. Trên đường đi, tôi đã dành rất nhiều thời gian để chơi với các cách sử dụng khác nhau của $PORT
biến và tôi không biết tại sao cấu hình tôi giải quyết trên các công trình. Tại một thời điểm tôi đã có điều này trong kịch bản:
echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \
Và có nhật ký nhật ký như thế này:
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
Thực chất câu hỏi của tôi là: chuyện gì đang xảy ra ở đây vậy? Điều này đối mặt với cách tôi hiểu {}
để làm việc trong các tập lệnh bash. Và tại sao tôi có thể sử dụng curlies trên COREOS_PRIVATE_IPV4
biến (được xuất từ /etc/environment
, nhưng không phải cho PORT
?