在 Linux 屏幕的 Docker 中以分离模式运行 python 进程



我已经为我的python应用程序编写了Dockerfile。

要求是:

  • 安装并启动mysql服务器。
  • 在分离模式下在屏幕中运行应用程序。

下面是我的 Dockerfile:

FROM ubuntu:16.04
# Update OS
RUN apt-get update
RUN apt-get -y upgrade
# Install Python
RUN apt-get install -y python-dev python-pip screen npm vim net-tools
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install mysql-server python-mysqldb
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app
RUN pip install --no-cache-dir -r requirements.txt
COPY src /usr/src/app/src
COPY ./src/nsd.ini /etc/
RUN pwd
RUN cd /usr/src/app
RUN service mysql start  
RUN /bin/bash -c "chmod +x src/run_demo_app.sh && src/run_demo_app.sh"

以下是 bash 脚本的内容

$ cat src/run_demo_app.sh
$ screen -dm bash -c "sleep 10; python -m src.app";

问题是Mysql无法启动。我需要从容器手动启动它。

此外,屏幕将死机,应用程序无法启动。手动运行脚本工作正常。

所以这是一个理解差距,没有别的。请注意 docker 文件中的以下问题

从不使用服务命令

RUN service mysql start  

Docker不使用init系统。所以永远不要在 docker 中使用service命令。

不要把所有东西都放在同一个容器里

您不应该将所有东西都放在同一个容器中。所以mysql应该在自己的容器中运行,python应该在自己的容器中运行

使用官方图片

你不需要重新发明轮子。尽可能使用官方图片。您应该在案例中使用mysqlpython图像

在需要多个服务时使用 docker-compose

在您的情况下,由于您需要多个服务,请使用docker-compose.

无需在码头工人中使用屏幕

当您希望进程运行时,即使 SSH 断开连接,也会使用屏幕。这样在码头工人中就不需要了。如果使用附加-d标志运行docker rundocker-compose up命令,则容器将在后台自动启动

最新更新