我正在覆盖/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
Run Code Online (Sandbox Code Playgroud)
我正在以Packer 的身份运行上述脚本AMI构建步骤。
当我启动我的 AMI 时,我看到以下关于 SystemD Docker 服务的状态输出:
? 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}}
Run Code Online (Sandbox Code Playgroud)
它没有运行 my 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}}
Run Code Online (Sandbox Code Playgroud)
请注意它现在如何 ExecStartPre在状态输出中显示?
除了daemon-reload使 SystemD 加载和运行新的服务配置文件和ExecStartPre脚本之外,是否还有我应该在 Packer 构建中运行的命令?我应该只是restart使用 Packer 构建中的服务,还是有更好、更量身定制的解决方案?
注意:我的ExecStartPre脚本需要可curl用于 EC2 实例标签的网络。Docker 服务文件确实指定了,After=network.target docker.socket所以我假设它会在网络启动后运行。
嗯,这是预期的行为。如果您打算在覆盖 docker 单元文件后重新启动 docker 服务,则应该在脚本中调用systemctl restart docker.serviceafter 。systemctl daemon-reload如果您还想仅在已运行的情况下重新启动 dokett,请改为调用systemctl try-restart docker.service。
命令的目的systemctl daemon-reload是告诉systemd守护进程重新加载其所有配置,重新加载单元文件并重新生成服务依赖关系树。但是,即使磁盘上的单元文件发生更改,它也不会影响系统中的任何其他服务。
| 归档时间: |
|
| 查看次数: |
5301 次 |
| 最近记录: |