gpt4 book ai didi

python - 为什么uWSGI在Docker中启动失败?

转载 作者:行者123 更新时间:2023-12-01 03:54:32 25 4
gpt4 key购买 nike

我对使用uWSGI为Python应用程序提供服务相对较新,并且我尝试使用vassal以皇帝模式启动uWSGI进程,但是每次我尝试使用以下命令在Docker内部启动uWSGI时(如):

# /usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini

我得到的回复是:

[uWSGI] getting INI configuration from /etc/uwsgi/emperor.ini
2.0.13.1

emperor.ini 配置文件如下所示:

# files/etc/uwsgi/emperor.ini
[uwsgi]
emperor = /etc/uwsgi/apps-enabled
die-on-term = true
log-date = true

虽然唯一的附庸的配置如下:

# files/etc/uwsgi/apps-enabled/application.ini
[uwsgi]
app_dir = /var/www/server
plugin = python
master = true
callable = app
chdir = %(app_dir)
mount = /=%(app_dir)/start.py
protocol = uwsgi
socket = :8079
uid = www-data
gid = www-data

buffer-size = 32768
enable-threads = true
single-interpreter = true
processes = 1

stats = 127.0.0.1:1717

(注意:上面的文件名是根据它们相对于 Dockerfile 的位置给出的,然后 Dockerfile 将它们复制到正确的位置,基本上删除了前缀 files )

目前,我使用的 uWSGI Docker 镜像是基于 ubuntu:trusty 基础镜像构建的(尽管我已经尝试过 ubuntu:latestalpine :latest 并遇到了同样的问题),尽管我尝试使用主管启动 uWSGI 进程,如前所述,但直接从命令行运行时也会失败。在 Docker 镜像中,我使用 pip 安装 uWSGI,但也尝试使用 apt-get 获得相同的结果。

我还应该提到,我尝试了不同版本的 uWSGI 2.0.13.1 和 1.9.something,但结果相同,如果有帮助的话。

# Dockerfile
FROM ubuntu:trusty
MAINTAINER Sean Quinn "me@mail.com"

RUN apt-get update \
&& apt-get install -y \
ack-grep git nano \
supervisor \
build-essential gcc python python-dev python-pip

RUN sed -i 's/^\(\[supervisord\]\)$/\1\nnodaemon=true/' /etc/supervisor/supervisord.conf \
&& sed -i 's/^\(\[supervisord\]\)$/\1\nloglevel=debug/' /etc/supervisor/supervisord.conf \
&& sed -i 's/^\(files = .*\)$/;\1/' /etc/supervisor/supervisord.conf \
&& sed -i 's/^\(\[include\]\)$/\1\nfiles = \/etc\/supervisor\/conf.d\/*.conf/' /etc/supervisor/supervisord.conf

ENV UWSGI_VERSION 2.0.13.1

RUN pip install uwsgi==${UWSGI_VERSION}

RUN mkdir -p /etc/uwsgi \
&& mkdir -p /etc/uwsgi/apps-available \
&& mkdir -p /etc/uwsgi/apps-enabled \
&& mkdir -p /var/log/uwsgi

COPY files/etc/supervisor/conf.d/uwsgi.conf /etc/supervisor/conf.d/uwsgi.conf
COPY files/etc/uwsgi/emperor.ini /etc/uwsgi/emperor.ini

VOLUME /etc/uwsgi/apps-enabled
VOLUME /var/www

ENTRYPOINT ["/usr/bin/supervisord"]
CMD ["-c", "/etc/supervisor/supervisord.conf"]

如上所述,supervisord 进程尝试使用以下管理程序配置启动 uWSGI 进程。

# files/etc/supervisor/conf.d/uwsgi.conf
[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini
user=root

应用程序Python文件安装在/var/www的子目录中,应用程序uWSGI配置安装在/etc/uwsgi/apps-enabled中。

奇怪的是,如果我在新的 Ubuntu VM(Docker 之外)上安装 Supervisor 和 uWSGI,并且所有配置和文件都就位,我可以看到 uWSGI 正确处理 emperor.ini并读取vassal .ini 文件。我还没有尝试将 nginx 添加到方程式中,因为我想首先确保 uWSGI 正确启动并读取配置文件。

有什么方法可以增加日志记录或确定为什么我只看到看似 uWSGI 二进制文件的版本号?这就像 uWSGI 进程完全忽略命令行选项。我觉得我错过了一些应该显而易见的东西。

预先感谢任何人可以提供的任何帮助!

最佳答案

tl;dr don't use UWSGI_VERSION as an environment variable, apparently it forces uWSGI to only print the version number instead of start?

我相信我解决了自己的问题!

在 Docker 集线器上尝试其他 uWSGI 镜像后,我发现它们也遇到了同样的问题,因此我开始进一步研究可能的配置问题。我尝试更改权限等。

但是我注意到当我使用 jpetazzo/nsenter 时进入我看到uWSGI启动的运行容器(而不是简单地输出上面突出显示的uWSGI版本信息)。当使用docker exec进入时,uWSGI只会打印版本信息。经过一番尝试后,我发现从使用 docker exec 启动的容器内发出命令 su - 我再次看到 uWSGI 启动。

经过一番检查,我发现一个 shell 中的 root 用户与另一个 shell 中的环境变量存在一些差异。它引导我找到了 UWSGI_VERSION 环境变量,它似乎是罪魁祸首,因为删除 UWSGI_VERSION 允许 uWSGI 启动。

我修改了 Dockerfile,使用 UWSGI_PIP_VERSION 作为环境变量来指示要安装的 uWSGI 版本,这似乎是 UWSGI_VERSION 的安全替代方案。 YMMV。

关于python - 为什么uWSGI在Docker中启动失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37716826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com