我有一个 systemd 单元,它使用命令docker-compose
来启动和停止一组给定的容器。它看起来像这样:
[Unit]
Description=...
[Service]
WorkingDirectory=/opt/tsc-docker
RemainAfterExit=true
ExecStart=/usr/bin/docker-compose up -d --remove-orphans
ExecStop=/usr/bin/docker-compose down
Type=oneshot
[Install]
WantedBy=multi-user.target
它基本上按预期工作。如果我启动此服务,容器就会启动,如果我停止它,容器就会关闭。
缺少的是仅重新启动某些容器的能力(以及这个问题的含义)。
我的意思是,如果我编辑docker-compose.yml
并运行该docker-compose up -d
命令,则只会重新创建受影响的容器,而不是所有容器。
然而,当前的单元配置不允许我systemctl start TscDocker
再次运行并重新创建受影响的容器。由于该装置已经在运行,它只是忽略我的命令。如果我设置RemainAfterExit=false
,那么ExecStop
命令会在 后运行ExecStart
,这显然是不可取的。
我需要的是能够多次启动该服务并且ExecStart
每次都运行而不是ExecStop
在每次之后运行ExecStart
。
要创建选中所有框的配置,我有哪些选项?
答案1
听起来你想使用一个不可阻挡的一次性服务..它看起来像:
[Unit]
Description=...
[Service]
WorkingDirectory=/opt/tsc-docker
RemainAfterExit=false
ExecStart=/usr/bin/docker-compose up -d --remove-orphans
Type=oneshot
[Install]
WantedBy=multi-user.target
这将允许您多次启动该服务,因为一旦您的 ExecStart 完成运行,该服务就会返回到非活动状态。处理这个事实才是正确的做法,作为 systemd 的联机帮助页指定您不能在可停止的一次性服务中运行多个启动命令。
仍然能够使用 ExecStop 的一个肮脏的解决方法可能是使用 ExecReload 函数,如下所示
[Unit]
Description=...
[Service]
WorkingDirectory=/opt/tsc-docker
RemainAfterExit=true
ExecStart=/usr/bin/docker-compose up -d --remove-orphans
ExecReload=/usr/bin/docker-compose up -d --remove-orphans
ExecStop=/usr/bin/docker-compose down
Type=oneshot
[Install]
WantedBy=multi-user.target
因为这是在您的服务仍被视为活动时获得单独命令执行的唯一方法。然后您可以使用
systemctl reload TscDocker