带有 docker 容器的 Systemd 服务文件在 ExecStop 上引发“失败”状态

问题描述 投票:0回答:1

我有服务文件,用于启动和停止自己编写的代理服务器。

[Unit]
Description=Golang proxy server in Docker
After=network.target docker.service
Requires=docker.service

[Service]
Type=simple
WorkingDirectory=/home/ooolledj/socks5-proxy
ExecStart=/usr/bin/docker container rm goproxy --force ; /usr/bin/docker run --name goproxy -p 12345:12345 goproxy:local
ExecStop=/usr/bin/docker container stop -t 1 goproxy
Restart=on-failure
TimeoutStartSec=10

[Install]
WantedBy=multi-user.target

它工作正常,除非我必须调用

systemctl stop goproxy
- 容器停止,服务处于“失败”状态。之后,我可以拨打
systemctl start goproxy
并且服务处于“活动(运行)”状态,没有任何问题。我想发生这种情况是因为容器进程(PID)死亡,守护进程看到,容器进程退出并引发错误
goproxy.service: Main process exited, code=exited, status=2/INVALIDARGUMENT

root@my-test-host:/home/ooolledj/socks5-proxy# systemctl status goproxy
● goproxy.service - Golang proxy server in Docker
     Loaded: loaded (/etc/systemd/system/goproxy.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2023-08-17 18:05:09 MSK; 881ms ago
    Process: 49618 ExecStartPre=/usr/bin/docker container rm goproxy --force (code=exited, status=0/SUCCESS)
    Process: 49624 ExecStart=/usr/bin/docker run --name goproxy -p 12345:12345 goproxy:local (code=exited, status=2)
    Process: 49717 ExecStop=/usr/bin/docker container stop -t 3 goproxy (code=exited, status=0/SUCCESS)
   Main PID: 49624 (code=exited, status=2)
        CPU: 135ms

Aug 17 18:04:58 my-test-host systemd[1]: Starting Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy...
Aug 17 18:04:58 my-test-host docker[49618]: goproxy
Aug 17 18:04:58 my-test-host systemd[1]: Started Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy.
Aug 17 18:05:09 my-test-host systemd[1]: Stopping Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy...
Aug 17 18:05:09 my-test-host docker[49717]: goproxy
Aug 17 18:05:09 my-test-host systemd[1]: goproxy.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Aug 17 18:05:09 my-test-host systemd[1]: goproxy.service: Failed with result 'exit-code'.
Aug 17 18:05:09 my-test-host systemd[1]: Stopped Golang proxy server in Docker: https://github.com/OOOlledj/socks5-proxy.

您能否建议如何使服务在停止或其他情况下进入“退出”状态?服务失败是不正确的——它所做的一切都绝对正确。

我尝试了 ExecStop、ExecStart 和 ExecStartPre 的许多选项,但没有得到积极的结果。

linux docker service containers systemd
1个回答
0
投票

解决方案非常简单 - 将代码添加到主函数中以处理退出代码为 0 的任何信号:

func main() {

    sigc := make(chan os.Signal, 1)
    signal.Notify(sigc,
        syscall.SIGHUP,
        syscall.SIGINT,
        syscall.SIGTERM,
        syscall.SIGQUIT)
    go func() {
        _ = <-sigc
        os.Exit(0)
    }()
// working code below
...
}

现在我的服务停止了,状态如

Active: inactive (dead)

© www.soinside.com 2019 - 2024. All rights reserved.