/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
ただし、ディスクのユニットファイルが変更されても、システムの他のサービスには影響しません。