Intereting Posts

SystemD не запускает ExecStartPre, пока я не перезагружу и не перезагружу службу

Я переопределяю сценарий запуска Docker SystemD, чтобы расширить его с помощью файла среды. Я определил свой файл конфигурации в /etc/systemdb/system/docker.service.d/docker.conf следующим образом:

 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 и 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 

Я запускаю вышеупомянутый скрипт как шаг сборки Packer для AMI.

Когда я запускаю свой AMI, я вижу следующий вывод состояния о службе Docker от 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}} 

Он не запускал мой ExecStartPre , как видно на выходе. Если я сделаю следующее, я вижу, что теперь он запускает сценарий запуска:

 # 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}} 

Обратите внимание на то, как теперь ExecStartPre статус?

Есть ли команда, которую я должен запускать в моей сборке Packer в дополнение к daemon-reload чтобы заставить SystemD загружать и запускать новый файл конфигурации службы и скрипт ExecStartPre ? Должен ли я просто restart службу в сборке Packer, или есть лучшее, более индивидуальное решение проблемы?

ПРИМЕЧАНИЕ. Моему сценарию ExecStartPre нужна сеть, ExecStartPre от тегов экземпляров EC2. Файл службы Docker указывает After=network.target docker.socket поэтому я предполагаю, что он будет запущен после начала работы сети.

Ну, это ожидаемое поведение. Если вы намереваетесь перезапустить службу докеры сразу после переопределения файла блока systemctl restart docker.service , вы должны вызывать systemctl restart docker.service после systemctl restart docker.service systemctl daemon-reload в скрипте. Если вы также хотите перезапустить docket только в том случае, если он уже запущен, вызовите systemctl try-restart docker.service .

Назначение systemctl daemon-reload состоит в том, чтобы сообщить демона systemd перезагрузить всю его конфигурацию, перезагрузить файлы блоков и восстановить дерево зависимостей службы. Тем не менее, это не влияет на другие службы в системе, даже если файлы модулей изменены на диске.