![如何将 docker-compose 作为 systemd 服务运行?](https://linux22.com/image/1193481/%E5%A6%82%E4%BD%95%E5%B0%86%20docker-compose%20%E4%BD%9C%E4%B8%BA%20systemd%20%E6%9C%8D%E5%8A%A1%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
我发现这个问题,但那个使用 cron - 我想改用 systemd 服务。我docker-compose.yml
的是/home/me
,我用 运行它sudo docker compose up
(并用 让它在后台运行tmux
),并用 停止它sudo docker compose down
。
尽管功能齐全,但我宁愿使用 systemd 服务来启动/停止我的docker-compose.yml
文件。
我如何才能将我的docker-compose.yml
文件转变为(可以工作的) systemd 服务?
答案1
我假设docker-compose文件位于/home/cocomac/docker-compose.yml
,但是你应该在我的示例中将其替换为docker compose文件的路径。
首先,让我们创建我们的服务文件。我喜欢文本编辑器微,就我个人而言,但您可以随意使用其他名称。我将调用我的服务docker-compose.service
,它将存储在中/etc/systemd/system
。如果您愿意,可以随意使用其他名称,但如果您这样做,请记住在遵循此答案的其余部分时使用该名称。
首先,让我们用文本编辑器创建并打开该文件:
$ micro /etc/systemd/system/docker-compose.service
将以下内容放入文件中:
[Unit]
Description=Some personal Docker containers
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c "docker compose -f /home/cocomac/docker-compose.yml up --detach"
ExecStop=/bin/bash -c "docker compose -f /home/cocomac/docker-compose.yml stop"
[Install]
WantedBy=multi-user.target
这为我们的服务提供了描述、启动 + 停止命令,以及启动前需要运行的内容。参见这个 Arch Wiki 页面了解不同的服务类型及其作用RemainAfterExit
。
保存文件并退出文本编辑器。现在您应该能够sudo systemctl start docker-compose
启动新的 systemd 服务。创建容器可能需要一点时间,但启动完成后,您可以sudo systemctl status docker-compose
检查服务状态。您还可以sudo systemctl stop docker-compose
停止它(或sudo systemctl enable docker-compose
在启动时自动启动它)
答案2
对服务节使用以下内容同样有效并且具有以下好处:您可以使用以下方式查看日志journalctl -u docker-compose
:
[Service]
Type=simple
ExecStart=/bin/bash -c "docker-compose -f /home/cocomac/docker-compose.yml up"
ExecStop=/bin/bash -c "docker-compose -f /home/cocomac/docker-compose.yml stop"
请注意,该docker-compose
命令不包含--detach
标志,您不需要该RemainAfterExit
选项。另请注意,在我测试的 Ubuntu 版本 (20.04) 上,docker-compose
这是一个单独的命令。
答案3
您还可以启动systemd
用户文件夹中列出的单元文件,并定期运行它们。例如,我有一个每天运行的 certbot 容器,以使我的 ftp 服务器的证书保持最新。
根据答案这里。
将您的用户配置文件设置为“linger”,并使用launchctl enable-linger ${USER}
。
在.eg中创建.service
并.timer
单元文件~/.config/systemd/user
~/.config/systemd/user/certbot-ftp.service
[Unit]
Description=Certbot LetsEncrypt renewal for vsftpd Server
[Service]
Type=oneshot
ExecStart=docker compose -f ~/docker-projects/ftp/compose.yaml restart certbot
[Install]
WantedBy=default.target
~/.config/systemd/user/certbot-ftp.timer
[Unit]
Description=Run Certbot on a daily basis
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
然后,启用该服务和相关计时器,无论您是否登录都会发生这种情况(因为已启用登录延迟):
systemctl --user enable certbot-ftp --now
答案4
如果你使用restart: always
在您的 docker compose 文件中(这是相当典型的),那么 docker 守护进程将在守护进程本身启动时自动重新启动容器 - 这意味着您不需要使用 systemd 来让它一直自动运行。
如果您对 Compose 文件进行更改或提取更新,您仍需要重新运行docker-compose
;这不会自动发生。但这不需要 systemd 文件。