关于自动执行shell脚本以添加新服务的docker systemctl问题

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

二手jrei / systemd-ubuntu码头工人形象,我做了一个容器。参考:https://hub.docker.com/r/jrei/systemd-ubuntu/dockerfile

我的最终目标是使用systemctl添加新服务,并在容器启动时执行它。

所以我做了如下3例测试。

  1. 在sh文件中执行/ lib / systemd / systemd

    !/bin/bash
    
    while true do
    
    /lib/systemd/systemd
    
    result=$(ps -ax|grep -v grep|grep systemd-journald)
    
    if [ "${#result}" -ne 0 ]
    
        then
    
            systemctl daemon-reload
    
            systemctl start gunicorn
    
            systemctl enable gunicorn
    
            break
    
        else
    
            echo "${#result}"
    
        fi 
    done
    

    结果:发生错误

    msg:尝试作为用户实例运行,但系统尚未使用systemd引导。

  2. docker-compose.yml中的添加命令

    command:
            - /bin/bash/
             - /root/test.sh
    

    结果:发生错误

    msg:尝试作为用户实例运行,但系统尚未使用systemd引导。

  3. 基于jrei / systemd-ubuntu重建dockerfile

    FROM jrei/systemd-ubuntu
    
    COPY service/* /etc/systemd/system/
    
    COPY test.sh /root/test.sh
    
    RUN chmod +x /root/systemctl_cmd.sh
    
    VOLUME [ "/sys/fs/cgroup" ]
    
    ENTRYPOINT ["/root/systemctl_cmd.sh"]
    

    结果:发生错误

    msg:尝试作为用户实例运行,但系统尚未使用systemd引导。

即使我测试了3次,也找不到任何方法。

因此,我希望对如何在上述命令中运行有任何了解。我想知道如何获取有关系统启动状态的信息。我认为如果在完成引导状态后运行systemctl命令,它就可以正常工作。

任何想法或技巧都很好。

docker docker-compose dockerfile docker-container systemctl
1个回答
0
投票
  1. 如果您只想启用它,则无需“启动独角兽”。只需使用“ systemctl enable --global foo.service”。如果您希望启动该服务,则请输入syy“ systemctl enable --now foo.service”。
  2. 实际上,当服务在容器中运行并最终停止时,您无需启用该服务。只需运行systemd守护程序并使用“ systemctl”要求守护程序启动服务。
  3. 由于“ systemd”是守护程序,因此需要将其推送到后台,以便systemctl可以找到其通信套接字。为了正确关闭,您需要确保您的shell脚本在SIGINIT上创建了一个“陷阱”,该陷阱来自“ docker stop”。

毕竟:互联网上有更好的例子,如何将容器像虚拟机一样与systemd一起使用。这还包括docker-systemctl-replacement项目,您还可以在其中查看docker-systemctl-images示例。

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