带有 conda env 的 uWSGI 不断失败 (Docker)

uWSGI with conda env keeps failing (Docker)

我一直在尝试多种方法来使用 uWSGI 和 NGINX 部署带有 conda 包的 Flask API,但没有成功。

将不胜感激任何帮助以使其正常工作。

在我目前的方法中,我使用 NGINX 基础映像,然后安装 python 包,conda,使用 environment.yml 的库部分创建一个新环境。然后在我的启动脚本中,我激活 conda env,启动 nginx 服务,然后启动 uwsgi。

我看到发生的事情是 uWSGI 无法 运行 作为安装了软件包的 conda env 的一部分,最终由于导入而失败。但是,如果我 运行 python main.py 从同一个地方开始,它会在开发模式下正常启动。

uwsgi.ini

[uwsgi]
module = main:app
uid = root
gid = root
master = true
processes = 5

socket = /tmp/uwsgi.socket
chmod-sock = 664
vacuum = true
plugins    = http,python3

die-on-term = true

Docker 文件

FROM nginx
SHELL [ "/bin/bash", "--login", "-c" ]

RUN apt-get update \
    && apt-get install -yyq netcat && apt-get install -y sudo


RUN apt-get update && apt-get install -y \
    python3-pip python3-dev uwsgi-plugin-python3 \
    nginx supervisor curl git wget

RUN apt-get install -y libpq-dev

COPY environment.yml requirements.txt /tmp/

COPY postBuild.sh /usr/local/bin/postBuild.sh
RUN chmod u+x /usr/local/bin/postBuild.sh
COPY docker/entrypoint.sh /usr/local/bin/
RUN chmod u+x /usr/local/bin/entrypoint.sh

COPY app /usr/local/bin/app
COPY app/nginx.conf /etc/nginx

RUN chmod u+x /usr/local/bin/app/start.sh

ENV MINICONDA_VERSION latest
ENV CONDA_DIR $HOME/miniconda3
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-$MINICONDA_VERSION-Linux-x86_64.sh -O ~/miniconda.sh && \
    chmod +x ~/miniconda.sh && \
    ~/miniconda.sh -b -p $CONDA_DIR && \
    rm ~/miniconda.sh
ENV PATH=$CONDA_DIR/bin:$PATH
RUN echo ". $CONDA_DIR/etc/profile.d/conda.sh" >> ~/.profile

RUN conda init bash
ENV PROJECT_DIR $HOME/app
WORKDIR $PROJECT_DIR
ENV ENV_PREFIX $PWD/env

RUN conda update --name base --channel defaults conda && \
    conda env create --prefix $ENV_PREFIX --file /tmp/environment.yml --force && \
    conda clean --all --yes

WORKDIR /usr/local/bin/app/



RUN conda activate $ENV_PREFIX && \
    /usr/local/bin/postBuild.sh && \
    conda deactivate


CMD ["./start.sh"]

start.sh

export PATH=/miniconda/bin:$PATH
echo ". /miniconda3/etc/profile.d/conda.sh" >> ~/.profile
conda init bash
eval "$(conda shell.bash hook)"
export PYTHONPATH=/env/bin/python
conda activate /env
service nginx start
uwsgi --ini uwsgi.ini

问题是您正在安装两个不同版本的 Python:一个是通过 apt-get(这是 uwsgi 想要的),另一个是使用 Conda。

您应该将 uwsgi 安装为 conda 包,即将其列为 environment.yml 中的依赖项。它应该可以通过 conda-forge 获得:https://anaconda.org/conda-forge/uwsgi

请参阅 https://pythonspeed.com/articles/importerror-docker/ 了解当 Python 程序无法 运行 或库无法导入时要检查的事项清单。