在为我的项目推荐它后,我最近购买了一个 vps。我想将一个简单的 golang 应用程序与一个 Rest api 端点部署到我的服务器。我对它进行了 docker 化并将其放在我的 vps 上,然后尝试将其设为自动运行的服务 - 这是服务文件:
Description=Portfolio Backend
[Service]
ExecStart=/snap/bin/docker run -d -p 8080:8080 portfoliobackend
Restart=always
User=root
Group=root
WorkingDirectory=/go/src/portfolio2023
[Install]
WantedBy=multi-user.target
问题是,当我查看状态时,我收到一条错误消息,告诉我指定的目录是错误的:
root@35:/# systemctl daemon-reload
systemctl restart portfoliobackend.service
root@35:/# systemctl status portfoliobackend.service
× portfoliobackend.service - Portfolio Backend
Loaded: loaded (/etc/systemd/system/portfoliobackend.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2024-01-23 09:10:07 UTC; 3s ago
Process: 100407 ExecStart=/snap/bin/docker run -d -p 8080:8080 portfoliobackend (code=exited, status=200/CHDIR)
Main PID: 100407 (code=exited, status=200/CHDIR)
CPU: 1ms
Jan 23 09:10:07 35.185.205.92.host.secureserver.net systemd[1]: portfoliobackend.service: Main process exited, code=exited, status=200/CHDIR
Jan 23 09:10:07 35.185.205.92.host.secureserver.net systemd[1]: portfoliobackend.service: Failed with result 'exit-code'.
Jan 23 09:10:07 35.185.205.92.host.secureserver.net systemd[1]: portfoliobackend.service: Scheduled restart job, restart counter is at 5.
Jan 23 09:10:07 35.185.205.92.host.secureserver.net systemd[1]: Stopped Portfolio Backend.
Jan 23 09:10:07 35.185.205.92.host.secureserver.net systemd[1]: portfoliobackend.service: Start request repeated too quickly.
Jan 23 09:10:07 35.185.205.92.host.secureserver.net systemd[1]: portfoliobackend.service: Failed with result 'exit-code'.
Jan 23 09:1
我想问这是否是最好的方法?有没有更好的替代方法? 谢谢您的帮助!
至于使用方式,是的,这个方法还是蛮管用的,也可以编译成二进制文件,通过systemctl来运行。
对于你的情况我会这样做:
[Unit]
Description=Portfolio Backend
After=snap.docker.dockerd.service
Requires=snap.docker.dockerd.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/snap/bin/docker exec %n stop
ExecStartPre=-/snap/bin/docker rm %n
ExecStartPre=/snap/bin/docker pull portfoliobackend
ExecStart=/snap/bin/docker run --rm --name %n \
-p 8080:8080 \
portfoliobackend
ExecStop=/snap/bin/docker exec %n stop
[Install]
WantedBy=multi-user.target
在这种情况下,您的容器将在启动前从 docker 注册表(docker pull)更新,并在停止后删除。 如果您不发布容器,请从此配置中删除 ExecStartPre=/snap/bin/docker pull PortfolioBackend。