当前位置: 首页 > 科技观察

使用Docker作为Python开发环境

时间:2023-03-14 17:15:33 科技观察

在本文中,我将尝试展示使用Docker开发Python应用程序(主要是Web应用程序)的可能方法。虽然我自己专注于Python的Flask微框架,但本文的目的是演示如何使用Docker更好地开发和共享应用程序(由任何语言和框架开发的应用程序)。Docker通过封装依赖,大大缩小了开发环境与正式产品的差距。大多数Python开发人员使用virtualenv进行开发。它为应用程序提供了一种易于使用的机制来使用自己的专有依赖项,这些依赖项可能会与其他应用程序或操作系统发生冲突(尤其是不同的Python版本,还包括不同的库版本等)。个人一直对virtualenv没多大兴趣,原因如下:经常忘记开启,或者切换项目时忘记切换,导致报错信息含糊不清,令人费解。它不能提供“纯”隔离,只能提供Python级别的隔离(系统库和非Python依赖项仍然可以中断)。我通常不想在生产中运行它,这意味着开发环境和生产环境之间存在不一致。感觉有点“hacky”:通过修改脚本和设置新路径来完成。(查看这篇来自pythonrants的文章,了解更多关于为什么您可能不想使用virtualenv的信息。)那么,Docker如何变得更好?Docker本质上提供了非常轻量级的VM(字面上称为“容器”),我们可以使用它们来创建具有高标准隔离并大大减少不匹配的开发和生产环境。(如果您是Docker的新手并想了解更多信息,可以查看我在爱丁堡技术研讨会上介绍Docker的演讲)。当我们构建一个小型可视化Web应用程序时,我和MarkColeman使用了这种方法(文档在这里)。这(内部)绘制了一个安装Python2.7的基本映像,以及一些Flask管理和PostgreSQL的东西。我将基于这张图片开发一个helloworldweb应用程序。我假设您正在Linux上进行开发并且已经安装了git和Docker,MacOS的说明应该非常相似。从克隆和构建一个基本镜像开始:$gitclonehttps://img.ydisp.cn/news/20220914/fht3uaqdcud$dockerbuild-tpython_webapp。现在,我们需要向容器中添加一些代码并对其进行详细描述。我们不打算直接修改以前的项目,而是打算创建一个仅指向Docker映像的新项目来完成这项工作。创建一个具有以下结构的新项目:├──Dockerfile├──example_app│├──app││├──__init__.py││└──views.py│└──__init__.py├──example_app。wsgi或者克隆这个地址的示例工程:https://github.com/amouat/example_app.git在example_app/app/_init_.py中写入:fromflaskimportFlaskapp=Flask(__name__)fromappimportviewsmakeanother_init_.pyasnull。在views.py中写入:fromappimportapp@app.route('/')@app.route('/index')defindex():return"Hello,World!"以上是我们的helloworld应用版本的最小flask。我在本教程中使用了类似的代码,所以如果您是Flask或Python的新手,可以按照上面提到的教程使用Docker代替virtualenv继续学习。为了让它在Docker容器中运行,我们需要做更多的事情。在我们的示例Apache服务器中,example_app.wsgi文件包含用于将Python代码连接到Web服务器的说明。该文件应包含以下内容:importsitesite.addsitedir('/opt/example_app/')fromappimportappasapplication最后,我们需要一个Dockerfile来构建和运行容器。在我们的实例中,它看起来像这样:FROMpython_webappMAINTAINEAmouatADDexample_app.wsgi/var/www/flaskapp/flaskapp.wsgiCMDserviceapache2start&&tail-F/var/log/apache2/error.logADD该行开始WSGI注入了一些代码。CMD行在启动容器和启动apacheweb服务器时抓取任何可能的错误消息,并将它们发送到stdout。如果您执行以下操作:$dockerbuild-texample_app。$dockerrun-p5000:5000-v$(pwd)/example_app:/opt/example_app/-i-texample_app你应该得到这样的东西:在你的浏览器中打开地址localhost:5000,你会看到你的网站正在运行。如果您在VM或vagrant中运行,请记住打开端口5000。我们现在运行的Web服务器非常接近我们在生产中使用的服务器(我有意为此使用Apache而不是Python的默认Web服务器)。我们通过从主机到容器的映射,将代码注入到容器中;我们也可以在Dockerfile命令行中使用ADD来添加代码,但是这样当我们团队的代码发生变化时,我们每次都需要重新构建容器。但是,这仍然不是很好;在开发中,我们真的很想使用Python网络服务器,这对我们调试有很大帮助。好消息是我们不必对Dockerfile进行任何更改。在example_app文件中,首先创建一个包含以下内容的run.py文件:!flask/bin/pythonfromappimportappapp.run(debug=True,host='0.0.0.0')监听所有连接,我们也可以从容器外部访问。现在使用以下命令重新启动容器:$dockerrun-p5000:5000-v$(pwd)/example_app:/opt/example_app/-i-texample_apppython/opt/example_app/run.py你应该会看到网页再次运行。这次我们明确提供要运行的命令(“python/opt/example_app/ryn.py”),它会覆盖Dockerfile中CMD行的设置。现在如果你在主机上编辑源程序,你可以立即在网页上看到变化。让我们花点时间看看我们得到了什么:一个在隔离容器中运行的Web应用程序,该容器完全封装了应用程序的Python依赖项和系统依赖项。能够使用现有的编辑器或IDE开发代码并直接查看更改,就像在本地编辑一样。运行环境比以前更接近正式产品。没有使用virtualenv。如果您想知道如何以这种方式构建分发路径,请查看MarkColeman关于上述可视化Web应用程序的文章。不幸的是,这一切还没有完成。还有一些问题:您可能仍然会遇到需要使用virtualenv或其等效解决方案的情况,例如库的操作系统版本与程序所需的版本之间存在冲突。我们还没有完全解决数据托管的问题,一些测试还有待完成。我假定的“产品”是Docker容器,但通常情况并非如此,Docker托管本身才刚刚起步。不过,我认为这是朝着更美好的软件开发未来迈出的一大步,大大减轻了部署软件和管理依赖项的痛苦。英文:UsingDockerasaPythonDevelopmentEnvironment翻译自:http://www.oschina.net/translate/using-docker-as-a-python-development-environment