我正在尝试创建我自己的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
3条答案
按热度按时间jtoj6r0c1#
如果您的应用程序只在容器中运行,那么您应该创建一个docker-entrypoint.sh脚本,并在末尾添加一个“exec”,这样您的应用程序就可以在容器中以重新Map的PID 1运行。这样,云系统就可以看到应用程序是否处于活动状态,并发送SIGTERM来停止应用程序。
如果你的应用程序能够在容器外的systemd环境中运行,那么你可以选择重用systemd描述符。它需要一个PID为1的init-daemon和一个服务管理器来检查“启用”的服务。一个例子是systemctl-docker-replacement脚本。
jljoyd4f2#
Docker容器应该有一个在前台运行的“entrypoint”命令来保持容器的运行。容器的基本思想是只要启动它的根进程保持运行,它就一直运行。因为你将发出一个
systemctl start qsinavAI.service
,所以命令会成功,但是一旦这个命令退出,容器就会停止。根据设计,当用于运行容器的根进程退出时,以分离模式启动的容器也会退出,...
请参阅有关此操作和在official documentation中启动nginx服务的一些参考。
因此,您应该在
Dockerfile
的末尾有一个入口点语句,而不是尝试将应用程序作为服务运行。然后,当您使用docker run
启动此容器时,可以指定-d
以“分离”模式运行它。例如,从
ExecStart
获取命令,并假设它在前台运行:af7jpaap3#
举例说明如何用systemd创建映像并像真实的环境一样 Boot 。需要一个
Dockerfile
。/sbin/init
对于初始化systemd和启用systemctl非常重要。然后构建系统。