SystemDは、サービスを再ロードして再起動するまでExecStartPreを実行しません。

SystemDは、サービスを再ロードして再起動するまでExecStartPreを実行しません。

/usr/lib/systemd/system/docker.service環境ファイルに拡張するための起動スクリプトをオーバーライドしています。設定ファイルを/etc/systemd/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

上記のスクリプトを実行しています。包装機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次に、ステータス出力にどのように表示されるかを確認してください。

daemon-reloadSystemDに新しいサービス構成ファイルとスクリプトをロードして実行させることに加えて、ExecStartPrePackerビルドでコマンドを実行する必要がありますか? Packerビルドのサービスを使用する必要がありますかrestart、それともこの問題に対してより良い適切なソリューションがありますか?

注:私のスクリプトには、ExecStartPreEC2インスタンスタグに利用可能なネットワークが必要です。curlDockerサービスファイルはそれを指定するAfter=network.target docker.socketので、ネットワークが起動した後に実行されると仮定します。

ベストアンサー1

まあ、これは予想される動作です。 dockerユニットファイルを上書きしてdockerサービスを再起動するには、スクリプトからafterを呼び出す必要がありますsystemctl restart docker.servicesystemctl daemon-reloaddokettがすでに実行されている場合にのみ再起動するには、代わりにdokettを呼び出しますsystemctl try-restart docker.service

コマンドの目的は、デーモンにすべての構成を再ロードし、ユニットファイルを再ロードし、サービス依存ツリーを再生成するようにsystemctl daemon-reload指示することです。systemdただし、ディスクのユニットファイルが変更されても、システムの他のサービスには影響しません。

おすすめ記事