Ich überschreibe das /usr/lib/systemd/system/docker.service
Startskript, um es mit einer Umgebungsdatei zu erweitern. Ich habe meine Konfigurationsdatei /etc/systemd/system/docker.service.d/docker.conf
wie folgt definiert:
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
Ich führe das obige Skript als Packer- Build-Schritt für eine AMI aus.
Wenn ich mein AMI starte, wird die folgende Statusausgabe über den Docker-Dienst von SystemD angezeigt:
● 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}}
Es hat meine nicht ausgeführt ExecStartPre
, wie in der Ausgabe zu sehen. Wenn ich Folgendes mache, sehe ich , dass jetzt das Startskript ausgeführt wurde:
# 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}}
Beachten Sie, wie es jetzt die ExecStartPre
in der Statusausgabe hat?
Gibt es einen Befehl, den ich in meinem Packer-Build daemon-reload
ausführen sollte, um zu veranlassen , dass SystemD die neue Dienstkonfigurationsdatei und das neue ExecStartPre
Skript lädt und ausführt ? Sollte ich nur restart
den Service im Packer Build erstellen oder gibt es eine bessere, maßgeschneiderte Lösung für das Problem?
HINWEIS: Für mein ExecStartPre
Skript muss das Netzwerk curl
für EC2-Instanz-Tags verfügbar sein . In der Docker-Dienstdatei wird angegeben After=network.target docker.socket
, dass sie nach dem Start des Netzwerks ausgeführt wird.
ExecStartPre
. Die Packer EC2-Instanz wird heruntergefahren und beim nächsten Start als AMI für eine neue EC2-Instanz ausgeführt. Das Problem besteht darin, dass das Skript in dieser Phase nicht aufgerufen wird.systemd
, aber ich weiß nicht, wie ich mit Amazon Compute Clouds umgehen soll. Die einzig mögliche Ursache ist, dass das Skriptdocker.service
nach dem Überschreiben der Einheitendatei nicht neu gestartet wird und dies auch tun sollte.Angenommen, das Netzwerk ist online, nachdem
network.service
es nicht 100% zuverlässig ist. Deshalb gibt es einenetwork-online.target
.Wenn Sie sich auf Curl verlassen und absolut sicher sein möchten, dass das Netzwerk aktiv ist, bevor der Dienst gestartet wird, DNS funktioniert usw., kann das Hinzufügen zu Ihrem
docker.conf
System hilfreich sein ...... und da Sie diesen ganzen Post-Boot ausführen, damit das Neue
ExecStartPre
funktioniert, sollten Sie entwedersystemctl daemon-reload && systemctl restart docker.service
odersystemctl stop docker.service && systemctl daemon-reload && systemctl start docker.service
in Ihrem Packer-Build-Skript hinzufügen . Letzteres ist am zuverlässigsten.Wenn Sie einen Dienst stoppen, bevor er geändert und abgeschlossen
daemon-reload
wird, wird sichergestellt, dass die gesamte Einheit wie angegeben neu geladen wird. Ich kann Sie in der dritten von Ausgang sehen haben vorgesehen , dass dieExecStart
fürdocker.service
nicht nicht enthält die Argumente , die Sie in dem Packer Build - Skript angegeben haben. Das liegt ansystemctl restart docker.service
(versus Stop, Daemon-Reload & Start).quelle