
/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-reload
SystemDに新しいサービス構成ファイルとスクリプトをロードして実行させることに加えて、ExecStartPre
Packerビルドでコマンドを実行する必要がありますか? Packerビルドのサービスを使用する必要がありますかrestart
、それともこの問題に対してより良い適切なソリューションがありますか?
注:私のスクリプトには、ExecStartPre
EC2インスタンスタグに利用可能なネットワークが必要です。curl
Dockerサービスファイルはそれを指定するAfter=network.target docker.socket
ので、ネットワークが起動した後に実行されると仮定します。
答え1
まあ、これは予想される動作です。 dockerユニットファイルを上書きしてdockerサービスを再起動するには、スクリプトからafterを呼び出す必要がありますsystemctl restart docker.service
。systemctl daemon-reload
dokettがすでに実行されている場合にのみ再起動するには、代わりにdokettを呼び出しますsystemctl try-restart docker.service
。
コマンドの目的は、デーモンにすべての構成を再ロードし、ユニットファイルを再ロードし、サービス依存ツリーを再生成するようにsystemctl daemon-reload
指示することです。systemd
ただし、ディスクのユニットファイルが変更されても、システムの他のサービスには影響しません。
答え2
ネットワークがnetwork.service
「オンライン」の場合、100%信頼できないとします。そのため、一つがありますnetwork-online.target
。
カールに依存し、サービスが開始される前にネットワークが稼働しているか、DNSが機能しているかなどを絶対に確認したい場合は、それをサービスに追加するとdocker.conf
便利です。
[Unit]
After=network-online.target
...そしてこれらのリリース後にすべての作業を実行するので、新機能がExecStartPre
正しく機能するためにPackerビルドスクリプトにまたはを追加する必要がありますsystemctl daemon-reload && systemctl restart docker.service
。systemctl stop docker.service && systemctl daemon-reload && systemctl start docker.service
後者が最も信頼できる。
変更およびdaemon-reload
完了前にサービスを停止すると、デバイス全体が指定どおりに再ロードされます。提供された出力の3番目のビットで見ることができますExecStart
。docker.service
いいえPackerビルドスクリプトに指定したパラメータが含まれています。これは、systemctl restart docker.service
(停止、デーモンの再ロード、および開始を含む)によるものです。