我使用uWSGI来提供Python应用程序相对较新,我试图用一个vassal在emperor模式下启动uWSGI进程,但每次我尝试使用以下命令在Docker中启动uWSGI(如{{1 }}):
root
我得到的回应是:
# /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
( NB:上面的文件名是根据它们相对于Dockerfile的位置给出的,然后将它们复制到正确的位置,基本上删除前缀# 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
)
目前我正在使用的uWSGI Docker镜像是基于files
基础图像构建的(虽然我尝试过ubuntu:trusty
和ubuntu:latest
并遇到了同样的问题),虽然我正在尝试使用supervisor启动uWSGI进程,如前所述,它直接从命令行运行时也会失败。在Docker镜像中,我正在使用alpine:latest
安装uWSGI,但也尝试使用pip
并使用相同的结果。
我还应该提一下,我尝试过不同版本的uWSGI 2.0.13.1和1.9.something具有相同的结果,如果有帮助的话。
apt-get
如上所述,# 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"]
进程尝试使用以下主管配置启动uWSGI进程。
supervisord
应用程序Python文件安装在# files/etc/supervisor/conf.d/uwsgi.conf
[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini
user=root
的子目录中,应用程序uWSGI配置已安装到/var/www
。
奇怪的是,如果我在一个新的Ubuntu VM(在Docker之外)上安装了supervisor和uWSGI,并且所有配置和文件都已就绪,我可以看到uWSGI正确处理/etc/uwsgi/apps-enabled
并读取vassal { {1}}个文件。我还没有尝试将nginx添加到等式中,因为我想确保uWSGI首先正确启动并正确读取配置文件。
有没有办法增加日志记录或确定为什么我只看到似乎是uWSGI二进制文件的版本号?这就像uWSGI进程完全忽略了命令行选项。我觉得我错过了一些显而易见的事情。
提前感谢任何人都可以提供帮助!
答案 0 :(得分:2)
tl; dr 不要将
UWSGI_VERSION
用作环境变量,显然它会强制uWSGI只打印版本号而不是开始?
我相信我解决了自己的问题!
在Docker的集线器上试验其他uWSGI映像后,我发现它们也遇到了同样的问题,所以我开始深入研究可能的配置问题。我尝试在其他方面更改权限。
但是我注意到当我使用jpetazzo/nsenter进入我看到uWSGI启动的运行容器时(而不是简单地输出上面突出显示的uWSGI版本信息)。使用docker exec
输入时,uWSGI只会打印版本信息。在玩了一下之后,我发现从使用su -
启动的容器中发出命令docker exec
我再次看到uWSGI开始。
经过一番检查,我发现一个shell中的root
用户与另一个shell之间的环境变量存在一些差异。它引导我进入UWSGI_VERSION
环境变量,这似乎是罪魁祸首,因为删除UWSGI_VERSION
允许uWSGI启动。
我修改了我的Dockerfile以使用UWSGI_PIP_VERSION
作为环境变量来指示要安装的uWSGI的版本,这似乎是UWSGI_VERSION
的安全替代品。 YMMV。