繁体   English   中英

在 docker 容器内使用 systemd 创建 linux 服务

[英]create linux service with systemd inside docker container

创建了 flask 应用程序并部署在 docker 上的 gunicorn 服务器上。 I want to write shell script to create linux service inside docker container, so I can start, stop and restart my flask app inside container.

Dockerfile:

FROM python
COPY ./app /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 9003
CMD ["gunicorn", "-b", "0.0.0.0:9003", "main:app"]

使用命令构建并运行: docker run -p 9003:9003 myapp

我试过打开 docker 容器cli: docker exec -it <container_id> bash 您可以通过命令docker ps找到容器 ID。

第 1 步:将目录更改为 /etc/init.d 并创建 myservice.service 文件。

[Unit]
Description=Gunicorn instance to serve app

[Service]
WorkingDirectory=/home/app
ExecStart=gunicorn --workers 3 --bind 0.0.0.0:9003 unix:app.sock -m 007 main:app
Restart=always

[Install]
WantedBy=multi-user.target

第 3 步:我首先运行cd /etc/rc3.d启用服务,然后运行ln -s../init.d/{SERVICENAME} S95{SERVICENAME}

第 4 步:授予权限: chmod +x /etc/init.d/{SERVICENAME}第 5 步:启动服务:`service myservice start

但这给了我错误在此处输入图像描述

Docker 容器操作系统:Debian 10

为什么它给我单位未找到? 任何想法? 如何解决?

为什么它给我单位未找到? 任何想法? 如何解决?

您在错误的目录中不正确地创建了文件并创建了不相关的链接。 您似乎正在将 rc-scripts 与 systemd 混合使用。 它们不一样,它们完全不同。 抛开 rc-scripts 并忘记/etc/rc.d曾经存在过。 重新阅读并遵循有关如何将systemd服务文件添加到系统的优秀教程。

想编写 shell 脚本在 docker 容器内创建 linux 服务

这没有什么区别,因为您正在运行的容器运行 systemd - 您只运行CMD ["gunicorn"... ,因此您的服务将永远不会运行。 通常在 docker 中,使用 shell 脚本或在更复杂的情况下使用 supervisord 运行多个服务。 在您的情况下,无需设置任何东西 - 只需让 docker 将服务作为其 pid 0 进程运行,它只是一个进程。 重新研究 docker 是如何工作的,并研究如何在 docker 中编写服务。

您可能想要创建的是主机上的服务文件,而不是 docker 容器内。

感谢您的回答。

使用 Window 10

请参阅参考资料和我在做什么。 在 docker 容器内的 /etc/systemd/system 中创建了 myproject.service。

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

这个新创建的服务没有被捕获,当我尝试使用命令service myproject start启动这个服务时,它给出了错误unrecognized service: myproject

操作系统如何知道已创建新服务并重新加载它。

在 Linux 中,通过运行 daemon-reload,它会捕获所有新创建的服务。 但是如果是 docker,该怎么做呢?

参考: https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04

对于 rc 脚本,参考: https://unix.stackexchange.com/questions/106656/how-do-services-in-debian-work-and-how-can-i-manage-them

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM