2017-05-28 51 views
2

我已經做了第一個碼頭容器,它的工作原理是按照Dockerfile調試容器化的python網絡應用程序

FROM python:3.5-slim 

RUN apt-get update && \ 
    apt-get -y install gcc mono-mcs && \ 
     apt-get -y install vim && \ 
     apt-get -y install nano && \ 
      rm -rf /var/lib/apt/lists/* 

RUN mkdir -p /statics/js 

VOLUME ["/statics/"] 

WORKDIR /statics/js 

COPY requirements.txt /opt/requirements.txt 

RUN pip install -r /opt/requirements.txt 

EXPOSE 8080 

CMD ["python", "/statics/js/app.py"] 

運行該命令後:

docker run -it -p 8080:8080 -v ~/Development/my-Docker-builds/pythonReact/statics/:/statics/ -d ciasto/pythonreact:v2

,當我打開localhost:8080頁我得到錯誤:

A server error occurred. Please contact the administrator. 

,但如果我跑this application正常,即不能直接放在集裝箱式我主機:它工作正常。

所以我想知道是什麼導致服務器錯誤。如何調試通過容器運行的python應用程序,以瞭解是什麼導致它無法工作。或者我做錯了什麼。

回答

1

主要做法是:

config.paths['static_files'] = 'statics' 

應該是:

config.paths['static_files'] = '/statics' 

我已經得到了你的應用,並與您的 'Hello World'

難道這些改變運行:

1)The提到config.paths['static_files'] = '/statics'

2)本Dockerfile(除去VOLUME

FROM python:3.5-slim 

RUN apt-get update && \ 
    apt-get -y install gcc mono-mcs && \ 
    apt-get -y install vim && \ 
    apt-get -y install nano && \ 
     rm -rf /var/lib/apt/lists/* 

COPY requirements.txt /opt/requirements.txt 

RUN pip install -r /opt/requirements.txt 

COPY ./statics/ /statics/ 
COPY app.py /app/app.py 
WORKDIR /statics/js 

EXPOSE 8080 

CMD ["python", "/app/app.py"] 

3)移動的非靜態app.py到一個適當的位置:該項目的根。

4)運行:docker build . -t pyapp,然後docker run -p 8080:8080 -it pyapp

您應該看到Serving on port 8080...從端子輸出。和瀏覽器中的Hello World

我已經分叉你的Github項目並做了pull-request


編輯:

如果您需要做,當你開發,具有體積可用於覆蓋包裝圖像中的應用程序運行容器的變化。例如:

docker run -v ./static/js/:/static/js -p 8080:8080 -it pyapp 

你可以有許多卷,只要你想,但應用程序已經擠滿了圖像,並準備推動地方。

+0

快速問題:爲什麼要將整個應用程序打包到容器中? –

+0

這是Docker的主要功能之一:在圖像中打包應用程序並提供它們。如果您需要快速開發並更新刷新,您可以使用卷「碼頭運行」。我會將其添加到答案中 – Robert

1

您可以使用pdb在CLI中調試Python代碼。要實現這一點,您只需導入pdb並致電pdb.set_trace(),您希望在Python代碼中有斷點。基本上你必須在你想要的斷點處插入以下行:

import pdb; pdb.set_trace() 

然後你必須交互地運行你的Python代碼。

你可以做到這一點在你的容器

docker run -it -p 8080:8080 -v ~/Development/my-Docker-builds/pythonReact/statics/:/statics/ ciasto/pythonreact:v2 /bin/bash 

運行bash交互,然後用

[email protected]:/statics/js# python /statics/js/app.py 

手動運行你的應用程序時的代碼將達到斷點,它將暫停和提示符會顯示在哪裏你可以鍵入命令來檢查你的執行。 有關可用命令的更多詳細信息,可以查看the pdb commands documentation


另外,我注意到,您使用的是python:3.5-slim基礎圖像是不包括所有的通常包含在Python發行(非常)光Python的形象塑造你的形象。

the Python images page

This image does not contain the common packages contained in the default tag and only contains the minimal packages needed to run python. Unless you are working in an environment where only the python image will be deployed and you have space constraints, we highly recommend using the default image of this repository.

也許使用標準python:3.5圖像,而不是將解決您的問題。

+0

好的,謝謝我會試試看。我沒有想過我可以跳進同一個容器並使用調試器。 –

+0

實際上,我完全瞭解調試器,但最讓我困擾的是如果我直接在主機mac OS機器上運行,而不是在Linux容器 –

+0

上執行以下步驟,則該應用可用:我收到此消息: '默認渲染器不在渲染中,自動切換到kajiki 未提供app_globals,lib.app_globals.Globals不可用。 幫助程序未提供,lib.helpers不可用。「# –

0

作爲調試集裝箱應用程序的快速提示。如果您的應用程序因容器崩潰/停止而失敗。只需啓動CMD/ENTRYPOINT作爲/bin/bash的容器映像,然後手動啓動應用程序,一旦擁有容器外殼,就可以按照正常的Linux系統調試應用程序。 CMD可以直接覆蓋,按ENTRYPOINT只是使用--entrypoint標誌與docker run命令。