我正在尝试创建我自己的码头容器,以及我为我的工作创建的自定义服务,这是我的服务文件1/1 /etc/systemd/system/qsinavAI.service服务。
[Unit]
Description=uWSGI instance to serve Qsinav AI
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/root/AI/
Environment="PATH=/root/AI/bin"
ExecStart=/root/AI/bin/uwsgi --ini ai.ini
[Install]
WantedBy=multi-user.target当我试图运行这个服务时,我会得到这个错误。
系统未以systemd作为init系统(PID 1)引导。不能动手术。未能连接到总线:主机已关闭
我寻找了很多解决方案,但我找不到,我如何才能在码头启用systemctl。这是我用来运行容器的命令
docker run -dt -p 5000:5000 --name AIPython2 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --cap-add SYS_ADMIN last_python_image发布于 2021-02-15 16:02:54
如果您的应用程序只在容器中运行,那么您应该创建一个带有"exec“结尾的docker-entrypoint.sh脚本,以便您的应用程序在容器中作为一个重新映射的PID 1运行。这样,云系统就可以查看应用程序是否处于活动状态,并且可以发送一个SIGTERM来停止应用程序。
#! /bin/bash
cd /root/AI
PATH=/root/AI/bin
exec /root/AI/bin/uwsgi --ini ai.ini如果您的应用程序能够在容器外的systemd环境中运行,那么您可以选择重用systemd描述符。它需要PID 1上的init守护进程和一个服务管理器来检查"enbabled“服务。一个例子是系统-码头-替换脚本。
发布于 2021-02-15 09:43:25
Docker容器应该有一个在前台运行的"entrypoint“命令,以保持容器运行。容器背后的基本思想是,只要启动容器的根进程继续运行,它就会运行。由于您将发出一个systemctl start qsinavAI.service,该命令将成功,但一旦该命令退出,容器将停止。
根据设计,当用于运行容器出口的根进程时,容器以分离模式退出.
请参阅有关这方面的一些参考资料,并在正式文件中启动nginx服务。
因此,您应该在Dockerfile的末尾有一个entrypoint语句,而不是尝试将您的应用程序作为服务运行。然后,当您使用docker run启动这个容器时,可以指定-d以“分离”模式运行它。
例如,从ExecStart获取命令并假设它在前台运行:
ENTRYPOINT ["/root/AI/bin/uwsgi", "--ini", "ai.ini"]发布于 2022-09-23 09:51:15
举个例子,如何像一个真实的环境一样用systemd和boot创建映像。需要一个Dockerfile。
FROM ubuntu:22.04
RUN echo 'root:root' | chpasswd
RUN printf '#!/bin/sh\nexit 0' > /usr/sbin/policy-rc.d
RUN apt-get update
RUN apt-get install -y systemd systemd-sysv dbus dbus-user-session
ENTRYPOINT ["/sbin/init"]/sbin/init对于init和启用systemctl非常重要。
那就建立系统。
docker build -t testimage -f Dockerfile .
docker run -it --privileged --cap-add=ALL testimagehttps://stackoverflow.com/questions/66205286
复制相似问题