2017-08-28 93 views
1

我爲我的python應用程序編寫了Dockerfile。在卸載模式下在docker中運行python進程

要求是:

  • 安裝&啓動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沒有啓動。我需要從容器手動啓動它。

此外,屏幕變得死了,應用程序無法啓動。手動運行腳本工作正常。

回答

2

所以這是一個理解差距,沒有別的。注意下面的問題,在你的搬運工文件

切勿使用服務命令

RUN service mysql start 

碼頭工人不使用init系統的。所以千萬不要在docker中使用service命令。

不要把一切都放在同一個容器中

你不應該把一切都放在同一個容器中。所以mysql應在其自己的容器和蟒蛇在自己的

使用的官方圖片

你不需要重新發明輪子運行。儘可能使用官方圖片。您應該使用mysqlpython圖片,你的情況

使用泊塢窗,撰寫時需要多個服務

在你的情況,因爲你是需要多個服務,用docker-compose

無需使用屏幕上的搬運工,當你想你的過程中運行,即使您的SSH斷開

屏幕使用。所以在docker中不需要。如果您運行docker rundocker-compose up命令並附加-d標誌,那麼您的容器將自動在後臺啓動

+0

感謝@Tarun Lalwani的編輯和答案。我意識到docker-compose和運行'mysql'作爲單獨的容器。但我的要求是在單個容器中運行,這就是爲什麼我試圖啓動'mysql'作爲服務。感謝指出失敗的原因。我確實想使用屏幕,並沒有看到屏幕無法使用的原因。更重要的是,我想了解爲什麼它在容器啓動時失敗。 – nebi

+0

@nebi,看看這篇文章是否有助於http://tarunlalwani.com/post/deploying-code-inside-docker-images-statically-dynamically/。有一段使用supervisord,你應該在你的情況下使用 –