ubuntu 在Docker容器中启用systemctl

tquggr8v  于 2022-11-02  发布在  Docker
关注(0)|答案(3)|浏览(830)

我正在尝试创建我自己的Docker容器,以及我为我的工作创建的自定义服务,这是我的服务文件[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)启动。无法操作。无法连接到总线:主机已关闭
我搜索了很多来找到一个解决方案,但我不能,我怎么才能启用docker中的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
jtoj6r0c

jtoj6r0c1#

如果您的应用程序只在容器中运行,那么您应该创建一个docker-entrypoint.sh脚本,并在末尾添加一个“exec”,这样您的应用程序就可以在容器中以重新Map的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-daemon和一个服务管理器来检查“启用”的服务。一个例子是systemctl-docker-replacement脚本。

jljoyd4f

jljoyd4f2#

Docker容器应该有一个在前台运行的“entrypoint”命令来保持容器的运行。容器的基本思想是只要启动它的根进程保持运行,它就一直运行。因为你将发出一个systemctl start qsinavAI.service,所以命令会成功,但是一旦这个命令退出,容器就会停止。
根据设计,当用于运行容器的根进程退出时,以分离模式启动的容器也会退出,...
请参阅有关此操作和在official documentation中启动nginx服务的一些参考。
因此,您应该在Dockerfile的末尾有一个入口点语句,而不是尝试将应用程序作为服务运行。然后,当您使用docker run启动此容器时,可以指定-d以“分离”模式运行它。
例如,从ExecStart获取命令,并假设它在前台运行:

ENTRYPOINT ["/root/AI/bin/uwsgi", "--ini", "ai.ini"]
af7jpaap

af7jpaap3#

举例说明如何用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对于初始化systemd和启用systemctl非常重要。
然后构建系统。

docker build -t testimage -f Dockerfile .
docker run -it --privileged --cap-add=ALL testimage

相关问题