我已经创建了第一个docker容器,它按照Dockerfile
。
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应用程序,以了解导致它无法工作的原因。或者我做错了什么。
答案 0 :(得分:1)
您可以使用pdb
在CLI中调试Python代码。要实现这一点,您只需导入pdb
并调用pdb.set_trace()
,以便在Python代码中设置断点。基本上,您必须在需要断点的地方插入以下行:
import pdb; pdb.set_trace()
然后你必须以交互方式运行你的Python代码。
您可以通过
在容器中以交互方式运行bash
来实现
docker run -it -p 8080:8080 -v ~/Development/my-Docker-builds/pythonReact/statics/:/statics/ ciasto/pythonreact:v2 /bin/bash
然后使用
手动运行您的应用root@5910f24d0d8a:/statics/js# python /statics/js/app.py
当代码到达断点时,它将暂停并显示一个提示,您可以在其中键入命令以检查执行。 有关可用命令的更多详细信息,您可以查看the pdb commands documentation。
另外,我注意到您正在使用python:3.5-slim
基本图像构建图像,这是一个(非常)轻微的Python图像,不包括所有图像,通常包含在Python发行版中。
此图片不包含默认标记中包含的公共包,仅包含运行python所需的最小包。除非您在仅部署python映像并且存在空间限制的环境中工作,否则我们强烈建议您使用此存储库的默认映像。
使用标准的python:3.5
图片可能会解决您的问题。
答案 1 :(得分:1)
主要是这个:
config.paths['static_files'] = 'statics'
应该是:
config.paths['static_files'] = '/statics'
我已经使用您的“Hello World'
启动并运行您的应用程序这些改变了吗?
1)提到的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
您可以拥有任意数量的卷,但该应用已经打包在图像中并准备推送到某个地方。
答案 2 :(得分:0)
作为调试容器化应用程序的快速提示。如果您的应用程序因容器崩溃/停止而失败。只需使用CMD/ENTRYPOINT
作为/bin/bash
启动容器映像,然后在拥有容器shell后手动启动应用程序,您可以按照正常的Linux系统调试应用程序。 CMD
根据ENTRYPOINT
直接覆盖,只需使用--entrypoint
标记docker run
。