SystemD không chạy ExecStartPre cho đến khi tôi tải lại và khởi động lại dịch vụ


7

Tôi đang ghi đè /usr/lib/systemd/system/docker.servicetập lệnh khởi động để mở rộng tập lệnh bằng tệp môi trường. Tôi đã xác định tập tin cấu hình của mình /etc/systemd/system/docker.service.d/docker.confnhư sau:

test -d /etc/systemd/system/docker.service.d || \
    mkdir /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/docker.conf <<EOF
[Service]
EnvironmentFile=/etc/sysconfig/docker
ExecStartPre=-/usr/local/sbin/generate-docker-config
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --dns=\${LOCAL_IPV4}
EOF

systemctl daemon-reload

Tôi đang chạy tập lệnh trên dưới dạng bước xây dựng Packer cho AMI.

Khi tôi khởi chạy AMI của mình, tôi thấy đầu ra trạng thái sau về dịch vụ Docker từ SystemD:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker.conf
   Active: active (running) since Mon 2016-03-28 21:16:11 UTC; 6min ago
     Docs: https://docs.docker.com
 Main PID: 858 (docker)
   CGroup: /system.slice/docker.service
           ├─ 858 /usr/bin/docker daemon -H fd:// --dns=10.224.4.178 --log-driver=syslog --log-opt tag={{.ImageName}}

Nó không chạy của tôi ExecStartPre, như đã thấy trong đầu ra. Nếu tôi làm như sau, tôi làm thấy rằng nó bây giờ đã chạy script khởi động:

# systemctl daemon-reload && systemctl restart docker.service && \
    systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/docker.service.d
           └─docker.conf
   Active: active (running) since Mon 2016-03-28 22:05:24 UTC; 24ms ago
     Docs: https://docs.docker.com
  Process: 1873 ExecStartPre=/usr/local/sbin/generate-docker-config (code=exited, status=0/SUCCESS)
 Main PID: 1876 (docker)
   CGroup: /system.slice/docker.service
           └─1876 /usr/bin/docker daemon -H fd:// --dns=10.224.4.178 --log-driver=syslog --log-opt tag={{.ImageName}}

Lưu ý làm thế nào bây giờ có ExecStartPređầu ra trạng thái?

Có lệnh nào tôi nên chạy trong bản dựng Packer của mình ngoài daemon-reloadviệc khiến SystemD tải và chạy tệp cấu hình dịch vụ và ExecStartPretập lệnh mới không? Tôi có nên chỉ restartlà dịch vụ trong bản dựng Packer, hay có một giải pháp tốt hơn, phù hợp hơn cho vấn đề này không?

LƯU Ý: ExecStartPreTập lệnh của tôi cần mạng có sẵn curlcho các thẻ ví dụ EC2. Tệp dịch vụ Docker không chỉ định After=network.target docker.socketvì vậy tôi cho rằng nó sẽ chạy sau khi mạng bắt đầu.

Câu trả lời:


1

Vâng, đây là hành vi dự kiến. Nếu bạn có ý định khởi động lại dịch vụ docker ngay sau khi ghi đè tập tin đơn vị docker, bạn có nghĩa vụ phải gọi systemctl restart docker.servicesau systemctl daemon-reloadtrong tập lệnh. Nếu bạn cũng muốn khởi động lại docket chỉ khi nó đang chạy, hãy gọi systemctl try-restart docker.servicethay thế.

Mục đích của systemctl daemon-reloadcác lệnh là yêu cầu systemddaemon tải lại tất cả cấu hình của nó, tải lại các tệp đơn vị và tạo lại cây phụ thuộc dịch vụ. Tuy nhiên, nó không ảnh hưởng đến bất kỳ dịch vụ nào khác trong hệ thống, mặc dù các tệp đơn vị được thay đổi trên đĩa.


1
Phần bất ngờ của hành vi là khi tôi khởi động lại hệ thống, nó không tải trong ExecStartPre. Phiên bản Packer EC2 bị tắt, và lần sau khi nó được khởi chạy là AMI cho một thể hiện EC2 mới, và vấn đề là trong giai đoạn này , nó không gọi được tập lệnh.
Naftuli Kay

Sau đó, tôi sợ rằng tôi không thể giúp bạn về vấn đề này. Tôi biết cách quản lý các dịch vụ systemd, nhưng tôi không biết cách xử lý các đám mây tính toán của Amazon. Nguyên nhân có thể duy nhất tôi hình dung là tập lệnh không khởi động lại docker.servicesau khi ghi đè tập tin đơn vị của nó và nó nên làm.
Anderson Medeiros Gomes

1

Giả sử mạng là 'trực tuyến' sau khi network.servicekhông đáng tin cậy 100%. Đó là lý do tại sao có một network-online.target.

Nếu bạn đang phụ thuộc vào curl và muốn chắc chắn rằng mạng đã hoạt động trước khi dịch vụ bắt đầu, DNS hoạt động, v.v. sau đó thêm điều này vào docker.confcó thể giúp bạn ...

[Unit]
After=network-online.target

... và vì bạn đang thực hiện tất cả bài đăng này, để cái mới ExecStartPrehoạt động, thì bạn nên thêm systemctl daemon-reload && systemctl restart docker.servicehoặc systemctl stop docker.service && systemctl daemon-reload && systemctl start docker.servicetrong tập lệnh xây dựng Packer của mình. Thứ hai là đáng tin cậy nhất.

Dừng dịch vụ trước khi sửa đổi và daemon-reloadhoàn thành sẽ đảm bảo toàn bộ thiết bị được tải lại theo quy định. Tôi có thể thấy trong các bit thứ ba của đầu ra bạn đã cung cấp rằng ExecStartcho docker.servicekhông không chứa các đối số bạn đã chỉ định trong xây dựng kịch bản Packer. Đó là vì systemctl restart docker.service(so với dừng, tải lại daemon, và bắt đầu).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.