【问题标题】:systemd service not works in dockersystemd 服务在 docker 中不起作用
【发布时间】:2022-01-04 12:12:23
【问题描述】:

我的环境在 docker image(ubuntu 20.04) 下,我想在每次启动 mydocker 后使用 systemd 启动我的服务,我在这里有自己的 .service 文件:

/etc/systemd/system/my.service:

[Unit]
Description=my test
Documentation=man:test auto(8) man:test_config(5)

[Service]
ExecStart=/root/test.sh
Type=oneshot

[Install]
WantedBy=multi-user.target

/root/test.sh 已经 chmod 777:

#!/bin/bash

echo "hello~"  > /usr/local/test.log
exit 0

我做了以下操作:

systemctl enable my.service
docker stop mydocker
docker start mydocker
docker exec -it mydocker bash

但是在我启动 mydocker 之后,我没有看到 /root/test.sh 被执行,我像这样检查服务状态:

my.service - my test auto
    Loaded: loaded (/etc/systemd/system/my.service, enabled)
    Active: inactive (dead)

手动触发服务没问题:

root@:/# systemctl start my.service
root@:/# cat /usr/local/test.log 
hello~

我遗漏了什么吗?还是 systemd 在 docker 中不能正常工作?

谢谢。

【问题讨论】:

  • Systemd 在 Docker 中无法正常工作。我会将您的图像设置为具有 CMD /root/test.sh 以将脚本作为主容器进程运行,并在此处完全避免使用 systemd。
  • 也可以查看this post
  • 我看到这可能是合理的@DiogoSimõesdocker run -it --rm \ -e container=docker \ --tmpfs /run \ --tmpfs /tmp \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ --cap-add SYS_ADMIN \ centos /sbin/init 但我使用 ubuntu 没有找到 /sbin/init,似乎 docker 的目标是作为微服务器应用 systemd 功能作为 dockerfile CMD 和 docker running 命令...

标签: docker service systemd ubuntu-20.04 systemctl


【解决方案1】:

建议 #1

Docker 镜像应运行在 docker 镜像生成dockerfile 属性中指定的初始命令/程序:

入口点

CMD

请看这里:https://blog.knoldus.com/a-look-at-cmd-and-entrypoint-in-dockerfile/

建议 #2

在您的/etc/systemd/system/my.service: [unit] 部分添加Requires=Network.targetAfter=Network.target

像这样:

[Unit]
Description=my test
Documentation=man:test auto(8) man:test_config(5)
Requires=Network.target
After=Network.target

[Service]
ExecStart=/root/test.sh
Type=oneshot

[Install]
WantedBy=multi-user.target

建议#3

不要在 docker 镜像中使用 systemd 服务。

在启动时使用 crontab 作业。

https://www.linode.com/docs/guides/run-jobs-or-scripts-using-crontab-on-boot/

crontab 作业

@boot /root/test.sh 

【讨论】:

  • systemd 不适用于 docker,我在 vm 或物理机或虚拟机上尝试过,它可以工作,但在 docker 中它总是失败。无论如何,我会采取一些替代品,谢谢。
  • systemd 确实可以与 docker 一起使用,以供docker run 命令选项中包含正确功能的用户使用。但这是一个安全风险。也允许 docker 用户访问主机 systemd。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 2017-08-15
  • 1970-01-01
  • 2023-01-19
  • 2020-03-16
相关资源
最近更新 更多