我正在尝试在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推送了代码,并显示了相同的错误。我认为每次执行操作时都会删除软件包,因为我发现在执行推送操作后会删除此软件包创建的某些文件夹。
我总是得到的错误如下:
答案 0 :(得分:0)
根据您的描述,您正在使用基于Docker的Linux版Azure WebApp。因此,您在容器中所做的任何更改都只会写入container layer
中,而在删除容器时(包括停止/重新启动操作),# Add unixodbc support
RUN apt-get update \
&& apt-get install -y --no-install-recommends unixodbc-dev
会被删除,如正式的Docker文档About images, containers, and storage drivers所述,如下。 / p>
图像和图层
创建新容器时,可以在基础层之上添加新的可写层。该层通常称为“容器层” 。对运行中的容器所做的所有更改(例如写入新文件,修改现有文件和删除文件)都将写入此薄可写容器层。
容器和层
容器和图像之间的主要区别在于可写层最高。在容器中添加新数据或修改现有数据的所有写操作都存储在此可写层中。 删除容器后,可写层也将删除。基础图像保持不变。
因此,如果要将更改保存在运行的容器中,则必须通过命令docker commit
提交这些更改以创建新映像。或者在安装所需软件包的方案中,您可以按照Azure文档SSH support for Azure App Service on Linux
和Use a custom Docker image for Web App for Containers
将以下命令添加到Dockerfile中,以创建映像以将其推送并部署到Linux的Azure WebApp
label_id_one = 'INBOX'
label_id_two = 'UNREAD'
# Getting all the unread messages from Inbox
unread_msgs = GMAIL.users().messages().list(userId='me', labelIds=[label_id_one, label_id_two]).execute()