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

时间:2021-05-19 16:59:23

标签: linux docker

创建了 Flask 应用程序并在 docker 上的 gunicorn 服务器上部署。 我想编写 shell 脚本来在 docker 容器内创建 linux 服务,这样我就可以在容器内启动、停止和重新启动我的 Flask 应用程序。

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

但这给了我错误 enter image description here

Docker 容器操作系统:Debian 10

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

1 个答案:

答案 0 :(得分:0)

感谢回答。

使用窗口 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