当作为Docker镜像运行时,Django REST API挂起

没有作为Docker镜像运行时,一切正常。

Dockerfile:

FROM python:3.5.3-slim RUN mkdir /django-rest-api WORKDIR /django-rest-api ADD . /django-rest-api RUN pip install -r requirements.txt EXPOSE 8000 CMD ["python", "./djangorest/manage.py", "runserver"] 

构build命令:

 docker build -t django-rest-api . 

运行命令:

 docker run -p 8000:8000 django-rest-api 

manage.py:

 import os import sys print('lol') # <------- the only change from the original file if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangorest.settings") try: from django.core.management import execute_from_command_line except ImportError: # The above import may fail for some other reason. Ensure that the # issue is really that Django is missing to avoid masking other # exceptions on Python 2. try: import django except ImportError: raise ImportError( "Couldn't import Django. Are you sure it's installed and " "available on your PYTHONPATH environment variable? Did you " "forget to activate a virtual environment?" ) raise execute_from_command_line(sys.argv) 

而当我运行时,它只打印“哈哈”,当我按ctrl-c:

 ^Clol 

是什么让它等待中断?

当你运行这个容器时,我希望在标准输出上产生如下的东西:

 lol Performing system checks... System check identified no issues (0 silenced). July 14, 2017 - 22:14:35 Django version 1.10.2, using settings 'djangorest.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C. 

这是在250字节附近。

或者,也许如果你的服务器不是写debugging输出,它只会是lol\n ,这是4个字节。

您在docker run命令中没有使用-ti ,因此容器没有连接terminal,也没有设置为以交互模式运行。 在这种情况下,Docker将使用缓冲输出。 在这种情况下,标准的Linux行为是在缓冲区刷新到标准输出之前等待缓冲区累积了4096个字节(4KB)。

但是,由于到目前为止只输出了250个(或者只有4个)字节,所以缓冲区仍然处于等待状态。 所以没有任何东西是输出给你看。 如果您在端口8000上向服务器发出了一些请求,您很可能会很快达到4096字节并导致写入输出。

当您发送SIGINT( Ctrl C )时,这一切都会被短路,因为进程结束,所以缓冲区closures并写入输出。

Interesting Posts