我已经为我的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应该在自己的容器中运行
使用官方图片
你不需要重新发明轮子。尽可能使用官方图片。您应该在案例中使用mysql
和python
图像
在需要多个服务时使用 docker-compose
在您的情况下,由于您需要多个服务,请使用docker-compose
.
无需在码头工人中使用屏幕
当您希望进程运行时,即使 SSH 断开连接,也会使用屏幕。这样在码头工人中就不需要了。如果使用附加-d
标志运行docker run
或docker-compose up
命令,则容器将在后台自动启动