Docker:uwsgi服务无法识别

FROM ubuntu:14.04.2 RUN rm /bin/sh && ln -s /bin/bash /bin/sh RUN apt-get -y update && apt-get upgrade -y RUN apt-get install python build-essential python-dev python-pip python-setuptools -y RUN apt-get install libxml2-dev libxslt1-dev python-dev -y RUN apt-get install libpq-dev postgresql-common postgresql-client -y RUN apt-get install openssl openssl-blacklist openssl-blacklist-extra -y RUN apt-get install nginx -y RUN pip install "pip>=7.0" RUN pip install virtualenv uwsgi ADD canonicaliser_api /home/ubuntu/canonicaliser_api ADD config_local.py /home/ubuntu/canonicaliser_api/config/config_local.py RUN virtualenv /home/ubuntu/canonicaliser_api/venv RUN source /home/ubuntu/canonicaliser_api/venv/bin/activate && pip install -r /home/ubuntu/canonicaliser_api/requirements.txt RUN export CFLAGS=-I/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/include/ RUN source /home/ubuntu/canonicaliser_api/venv/bin/activate && cd /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/ && python setup.py build_ext --inplace RUN cp /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/canonicaliser/cython_extensions/*.so /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions RUN rm -rf /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/canonicaliser RUN rm -r /home/ubuntu/canonicaliser_api/canonicaliser/cython_extensions/build RUN mkdir /var/run/flask-uwsgi RUN chown -R www-data:www-data /var/run/flask-uwsgi RUN mkdir /var/log/flask-uwsgi RUN touch /var/log/flask-uwsgi/dqs_canon.log RUN chown -R www-data:www-data /var/log/flask-uwsgi RUN mkdir /etc/flask-uwsgi ADD configs/new-canon/flask-uwsgi/flask-uwsgi.conf /etc/init/ ADD configs/new-canon/flask-uwsgi/flask-uwsgi.ini /etc/flask-uwsgi/ EXPOSE 8888 CMD service flask-uwsgi restart # RUN echo "daemon off;" >> /etc/nginx/nginx.conf # CMD service nginx start 

当我尝试运行这个docker时,我收到错误消息:

 flask-uwsgi: unrecognized service 

所以我最后取消了最后两行的注释,这样nginx就可以开始并保持docker进程的活跃。 然后我开始debugging。

 docker exec -it 20b2ff3a4cac bash 

现在,当我尝试运行服务,这是同样的问题,我找不到任何缺失的步骤。 在docker中服务是不是可以这样启动的?

 root@30b2ff3a4cac:/# service flask-uwsgi start flask-uwsgi: unrecognized service 

/etc/flask-uwsgi/flask-uwsgi.ini

 [uwsgi] socket = /var/run/flask-uwsgi/flask-uwsgi.sock home = /home/ubuntu/canonicaliser_api/venv wsgi-file = flask_uwsgi.py callable = app master = true ; www-data uid/gid uid = 33 gid = 33 http-socket = :8888 die-on-term = true processes = 4 threads = 2 logger = file:/var/log/flask-uwsgi/flask-uwsgi.log 

/etc/init/flask-uwsgi.conf:

 start on [2345] stop on [06] script cd /home/ubuntu/canonicaliser_api exec uwsgi --ini /etc/flask-uwsgi/flask-uwsgi.ini end script 

当进入这个过程时,我可以直接运行这个uwsgi,它可以工作:

 exec uwsgi --ini /etc/flask-uwsgi/flask-uwsgi.ini 

所以在Docker中不支持服务,我必须直接在Docker镜像中运行这个服务:

 RUN exec uwsgi --ini /etc/flask-uwsgi/flask-uwsgi.ini 

或者我错过了一些东西。

是的,不要使用服务。

你不能这样做:

 RUN exec uwsgi --ini /etc/flask-uwsgi/flask-uwsgi.ini 

该行将完成,并致力于一个形象。 但是这个过程将不再在随后的说明中或容器启动时运行。

相反,您可以在ENTRYPOINT或CMD命令中执行它,因为它们在容器启动时执行。 这应该工作:

 CMD uwsgi --ini /etc/flask-uwsgi/flask-uwsgi.ini 

其他一些观点:

  • 如果您使用官方的Python图像之一,可能会更容易些。
  • 我只是摆脱virtualenv; 我没有看到virtualenv在一个孤立的容器中的好处。
  • 运行RUN rm -rf ...不保存任何空间; 这些文件已经被提交到前一层。 您需要删除添加的相同指令中的文件,以避免使用图像中的空间。
  • USER www-data而不是chowning文件可能是有意义的。