Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用Flask和Flask Migrate在Docker中运行入口点脚本,即使它在终端中工作_Python_Docker_Flask_Sh_Flask Migrate - Fatal编程技术网

Python 无法使用Flask和Flask Migrate在Docker中运行入口点脚本,即使它在终端中工作

Python 无法使用Flask和Flask Migrate在Docker中运行入口点脚本,即使它在终端中工作,python,docker,flask,sh,flask-migrate,Python,Docker,Flask,Sh,Flask Migrate,我有一个连接到Azure SQL数据库的FlaskAPI,部署在Azure应用程序服务的Docker映像中 它工作得很好,但我正在尝试使用Alembic/Flask Migrate应用数据库升级来保持我的开发、登台和生产环境之间的一致性 我在上看到,这可以通过向boot.sh脚本添加flask db upgrade命令来实现,如下所示: #!/bin/sh flask db upgrade exec gunicorn -w 4 -b :5000 --access-logfile - --erro

我有一个连接到Azure SQL数据库的FlaskAPI,部署在Azure应用程序服务的Docker映像中

它工作得很好,但我正在尝试使用Alembic/Flask Migrate应用数据库升级来保持我的开发、登台和生产环境之间的一致性

我在上看到,这可以通过向
boot.sh
脚本添加
flask db upgrade
命令来实现,如下所示:

#!/bin/sh
flask db upgrade
exec gunicorn -w 4 -b :5000 --access-logfile - --error-logfile - app:app
我的问题是,当运行
boot.sh
脚本时,我收到错误:

Usage: flask db [OPTIONS] COMMAND [ARGS]...
Try 'flask db --help' for help.

'.ror: No such command 'upgrade
这表示脚本找不到
库。如果我尝试其他站点包,例如仅尝试运行
flask
命令,就会发生这种情况

奇怪的是:

  • gunicorn工作得很好
  • API工作得很好
  • 如果我使用
    docker exec-I-tapi/bin/sh启动容器并打开终端会话,我可以毫无问题地运行
    flask db upgrade
显然,我的Dockerfile有问题。我非常感谢这里的任何帮助,因为我对Docker和Linux比较陌生,所以我确信我遗漏了一些明显的东西:

编辑:如果我将以下行添加到Dockerfile,就在entrypoint CMD之前,也可以正常工作:

RUN flask db upgrade
Dockerfile

FROM python:3.8-alpine

# Dependencies for pyodbc on Linux
RUN apk update
RUN apk add curl sudo build-base unixodbc-dev unixodbc freetds-dev
RUN apk add gcc musl-dev libffi-dev openssl-dev
RUN apk add --no-cache tzdata
RUN rm -rf /var/cache/apk/*
RUN curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.5.2.2-1_amd64.apk
RUN sudo sudo apk add --allow-untrusted msodbcsql17_17.5.2.2-1_amd64.apk

RUN mkdir /code
WORKDIR /code

COPY requirements.txt requirements.txt
RUN python -m pip install --default-timeout=100 -r requirements.txt
RUN python -m pip install gunicorn
ADD . /code/

COPY boot.sh /usr/local/bin/    
RUN chmod u+x /usr/local/bin/boot.sh
EXPOSE 5000
ENTRYPOINT ["sh", "boot.sh"]

我认为这是关键信息

这表示脚本找不到迁移库。如果我尝试其他站点包,例如仅尝试运行flask命令,就会发生这种情况

对我来说,这可能表明问题并非特定于
Flask Migrate
,而是针对所有软件包——正如您所写的那样。这可能意味着以下两种情况之一

首先,这可能意味着软件包没有正确安装。但是,这不太可能,因为在您编写时,当您手动启动容器时,它会起作用

其次,执行
boot.sh
脚本的方式有问题。例如,尝试改变

ENTRYPOINT ["sh", "boot.sh"]


我最终对Dockerfile和
boot.sh
脚本进行了一些重大更改。我将在下面尽我所能分享这些信息:

问题1:入口点脚本无法访问目录

我的主要问题是我的目录中有一个不一致的文件夹结构。共有2个
boot.sh
脚本,在entrypoint上运行的脚本要么权限不正确,要么位于查找我的网站包的错误位置

我简化了将文件从本地计算机复制到Docker映像的过程,如下所示:

RUN mkdir /code
WORKDIR /code

COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install --default-timeout=100 -r requirements.txt
RUN venv/bin/pip install gunicorn

COPY app app
COPY migrations migrations
COPY api.py config.py boot.sh ./
RUN chmod u+x boot.sh

EXPOSE 5000
ENTRYPOINT ["./boot.sh"]
所涉及的变化:

  • 设置virtualenv并在其中安装所有站点包
  • 确保
    config.py
    boot.sh
    api.py
    文件位于应用程序文件夹的根目录中(
    /
  • 将入口点命令从
    [“bin/sh”,“boot.sh”]
    更改为仅
    [“/boot.sh”]
  • 将迁移文件移动到升级脚本的相关文件夹中
然后,我能够激活入口点文件中的虚拟环境,并运行flask升级命令(注意:我遇到了一个问题,在
boot.sh
中,行尾是CRLF而不是LF,因此确保在Windows上更改它):

问题2:Alpine Linux太慢

我的另一个问题是,在Alpine Linux上构建我的映像需要花费很长时间(45分钟以上)。事实证明,在使用我的API中的一些库(Pandas、Numpy)时,这是一个错误

我切换到Debian构建,以便更快地更改Docker映像

包括安装pyodbc以连接Azure SQL Server,我的Dockerfile的前半部分现在看起来像:

FROM python:3.8-slim-buster

RUN apt-get update
RUN apt-get install -y apt-utils curl sudo gcc g++ gnupg2

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get install -y libffi-dev libgssapi-krb5-2 unixodbc-dev unixodbc freetds-dev 
RUN sudo apt-get update
RUN sudo ACCEPT_EULA=Y apt-get install msodbcsql17
RUN apt-get clean -y
curl
命令和下面的命令来自哪里

完整的dockerfile

FROM python:3.8-slim-buster

RUN apt-get update
RUN apt-get install -y apt-utils curl sudo gcc g++ gnupg2
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get install -y libffi-dev libgssapi-krb5-2 unixodbc-dev unixodbc freetds-dev 
RUN sudo apt-get update
RUN sudo ACCEPT_EULA=Y apt-get install msodbcsql17
RUN apt-get clean -y

RUN mkdir /code
WORKDIR /code

COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install --default-timeout=100 -r requirements.txt
RUN venv/bin/pip install gunicorn

COPY app app
COPY migrations migrations
COPY api.py config.py boot.sh ./
RUN chmod u+x boot.sh

EXPOSE 5000
ENTRYPOINT ["./boot.sh"]

它以前跑过吗?如果是,您做了哪些更改?映像生成,gunicorn运行-因此API本身工作正常。不幸的是,它只是抛出了一个警告:它找不到
flask db upgrade
命令。感谢您的响应:更改entrypoint命令并没有解决问题。看你的第一条评论,我假设这是我安装的网站包。我之前让他们安装在docker容器中的Virtualenv中,但之后我在激活所述环境时遇到了问题。想知道这是否与此有关?是的!如果您的
requirements.txt
创建了一个环境,可能就是这样。好吧,太棒了,这很有意义。我必须做一些工作来理解为什么我的virtualenv没有激活,一旦确认,我将恢复到这个线程。谢谢你的帮助。我现在会接受你的第一个答案。
FROM python:3.8-slim-buster

RUN apt-get update
RUN apt-get install -y apt-utils curl sudo gcc g++ gnupg2

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get install -y libffi-dev libgssapi-krb5-2 unixodbc-dev unixodbc freetds-dev 
RUN sudo apt-get update
RUN sudo ACCEPT_EULA=Y apt-get install msodbcsql17
RUN apt-get clean -y
FROM python:3.8-slim-buster

RUN apt-get update
RUN apt-get install -y apt-utils curl sudo gcc g++ gnupg2
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get install -y libffi-dev libgssapi-krb5-2 unixodbc-dev unixodbc freetds-dev 
RUN sudo apt-get update
RUN sudo ACCEPT_EULA=Y apt-get install msodbcsql17
RUN apt-get clean -y

RUN mkdir /code
WORKDIR /code

COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install --default-timeout=100 -r requirements.txt
RUN venv/bin/pip install gunicorn

COPY app app
COPY migrations migrations
COPY api.py config.py boot.sh ./
RUN chmod u+x boot.sh

EXPOSE 5000
ENTRYPOINT ["./boot.sh"]