python - Python:关于打包应用程序 docker vs pyinstaller 的问题
问题描述
我有一个 python 应用程序,我使用 pyinstaller 创建了一个可执行文件。整个 python 解释器与所有 pip 依赖项一起打包到可执行文件中。
所以现在我的应用程序可以在可能没有安装 python 或 python 模块的环境中运行,但仍然存在一些依赖项:
1) MongoDB - 这是我的应用程序使用的数据库,它当然需要安装在系统上才能正常工作。
2) Mosquitto - 该服务是必需的,因为应用程序使用 MQTT 来接收/发送命令。
我目前处理这个问题的方法是使用一个 shell 脚本,当我的应用程序部署在某个地方时,它会第一次安装 mongodb 和 mosquitto。我刚刚发现了 docker,我想知道它是否能够将这些“外部”依赖项打包到 docker 映像中?
我是否有可能拥有一个独立的“东西”,它可以在任何环境中运行,无论那里是否安装了 mongoDB 或 mosquitto?
我到底该怎么做呢?
(无关,但此应用程序旨在在树莓派上运行)
解决方案
如果你在这里采用了 Docker:
您仍然必须“单独”运行外部服务;它们本身不能打包成单个工件。不过,有一个名为 Docker Compose 的标准工具可提供此功能,并且您通常会分发一个docker-compose.yml
文件来描述如何运行一组相关容器。
将 Docker 映像作为文件分发是不常见的。相反,您会将构建的映像推送到注册表(如 Docker Hub,但主要的公共云提供商将其作为托管服务提供,有几个独立的服务,或者您可以运行自己的服务)。然后 Docker 可以通过 HTTP 检索图像。
Docker 容器只能由等效于 root 的用户运行。由于您正在谈论安装数据库作为启动过程的一部分,这可能不是您关心的问题,但您可以以普通用户身份运行纯 Python 或 pyinstallered 应用程序。任何可以运行任何 Docker 命令的人都可以在主机上拥有不受限制的根级别访问权限。
推荐阅读
- android - 如何在 FragmentDialog 中设置标题和文本?
- javascript - 如何检查动态命名父级的子属性是否存在?
- jdbc - Hive LLAP 守护程序无法通过 ODBC/JDBC 使用
- vb.net - 自动更新 Click-Once 网络部署应用程序的可靠方法
- html - 如何通过按钮或锚点更改标题
- python-3.x - 如何消除图像和线图之间的空白?将 'hspace' 设置为 0 不会这样做
- php - PHP新手;为什么我收到 500 错误?
- plot - 在 QGIS 中上传 CSV 没有意义
- code-search-engine - 如何跟踪 Hound 的使用情况
- php - 通过 PHP / cURL 发送 Base64 数据导致语音到文本只返回一个空的 json 字符串?