在 Azure 应用服务上为 Flask Web 应用安装 unixodbc-dev

Posted

技术标签:

【中文标题】在 Azure 应用服务上为 Flask Web 应用安装 unixodbc-dev【英文标题】:Install unixodbc-dev for a Flask web app on Azure App Service 【发布时间】:2019-05-28 20:17:59 【问题描述】:

我正在尝试在 Azure 应用服务上部署 Flask Web 应用。这个应用程序正在使用 pyodbc 连接到 mssql;但是,当我部署应用程序时出现此错误

ImportError: libodbc.so.2: 无法打开共享对象文件:没有这样的 文件或目录

我知道我可以通过安装 unixodbc/unixodbc-dev 来解决这个问题:

sudo apt-get install unixodbc-dev

我尝试通过访问 Kudu 的 SSH 手动执行此操作;但是,问题仍然存在。

我正在使用本地存储库并将带有 git 的代码推送到 Azure。当我收到这个错误时,我无法从 Kudu 访问控制台,所以我不得不注释代码并再次推送。然后我尝试通过执行 apt-get install unixodbc-dev 手动安装此软件包(因为无法识别 sudo)并且效果很好。然后我再次使用 pyodbc 推送代码,并显示相同的错误。我认为每次执行此操作时都会删除这些包,因为我发现此包创建的一些文件夹在推送操作后被删除。

我总是得到的错误如下:

【问题讨论】:

【参考方案1】:

根据您的描述,您使用的是基于 Docker 的 Linux 版 Azure WebApp。因此,您在容器中所做的任何更改都将写入container layer,当容器被删除时(包括停止/重启操作)将被删除,正如官方 Docker 文档About images, containers, and storage drivers 所述。

图像和图层

当您创建一个新容器时,您会在基础层之上添加一个新的可写层。该层通常称为“容器层”。对正在运行的容器所做的所有更改,例如写入新文件、修改现有文件和删除文件,都会写入这个薄的可写容器层。

容器和层

容器和图像之间的主要区别在于顶部可写层。添加新数据或修改现有数据的所有对容器的写入都存储在此可写层中。 当容器被删除时,可写层也被删除。底层图像保持不变。

因此,如果您想将更改保存在正在运行的容器中,则必须通过命令docker commit 提交这些更改以创建新映像。或者,在您安装所需软件包的场景中,您可以按照 Azure 文档 SSH support for Azure App Service on LinuxUse a custom Docker image for Web App for Containers 将以下命令添加到 Dockerfile 中,以创建映像以将其推送并部署到适用于 Linux 的 Azure WebApp。

# Add unixodbc support
RUN apt-get update \
        && apt-get install -y --no-install-recommends unixodbc-dev

【讨论】:

以上是关于在 Azure 应用服务上为 Flask Web 应用安装 unixodbc-dev的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 上为 .NET Web Api 启用 CORS

无法在 Azure Web App 上为来自 DockerHub 的容器部署 Windows 容器

如何在使用heroku部署的flask webapp上为每个用户实现唯一的会话[重复]

使用数据库连接将代码部署到 Azure Web 时,Flask 应用程序无法呈现,但在本地服务器上工作正常

ASP.NET HttpContext 在 Azure 上为空

如何在 Azure DevOps 上为发布服务器项目而不是客户端的 Blazor WebAssembly 托管应用程序创建构建管道?