在 docker 中以分离模式在 linux 屏幕中运行 python 进程

neb*_*ebi 1 python docker dockerfile

我已经为我的 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"
Run Code Online (Sandbox Code Playgroud)

下面是bash脚本的内容

$ cat src/run_demo_app.sh

$ screen -dm bash -c "sleep 10; python -m src.app";
Run Code Online (Sandbox Code Playgroud)

问题是Mysql 没有启动。我需要从容器手动启动它。

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

Tar*_*ani 5

所以这是一个理解差距,仅此而已。请注意您的 docker 文件中的以下问题

永远不要使用服务命令

RUN service mysql start  
Run Code Online (Sandbox Code Playgroud)

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

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

你不应该把所有东西都放在同一个容器里。所以mysql应该在它自己的容器中运行,并在它自己的 python 中运行

使用官方图片

你不需要重新发明轮子。尽量使用官方图片。你应该在你的情况下使用mysqlpython图像

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

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

无需在 docker 中使用屏幕

当您希望即使 SSH 断开连接也能运行进程时,将使用 Screen。所以在docker中不需要。如果您使用附加标志运行您的docker rundocker-compose up命令,-d那么您的容器将在后台自动启动