docker-compoes.yml设置与Django + Gunicorn + NGINX不适用于`docker-compose up`

这是我的文件夹结构。

./awesome_app ├── awesome_app │  ├── celery.py │  ├── __init__.py │  ├── settings.py │  ├── urls.py │  └── wsgi.py ├── awesome_app_to_do_list ├── db.sqlite3 ├── docker-compose.yml ├── Dockerfile ├── logs │  ├── nginx-access.log │  └── nginx-error.log ├── manage.py ├── nginx │  └── nginx.conf ├── requirements.txt ├── run └── start.sh 

这是我的nginx.conf。

 upstream awesome_app { server unix:/home/notalentgeek/Downloads/awesome_app/run/gunicorn.sock fail_timeout=10s; } server { client_max_body_size 4G; listen 8080; access_log /home/notalentgeek/Downloads/awesome_app/logs/nginx-access.log; error_log /home/notalentgeek/Downloads/awesome_app/logs/nginx-error.log warn; location /static/ { autoindex on; alias /home/notalentgeek/Downloads/awesome_app/static/; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; if (!-f $request_filename) { proxy_pass http://awesome_app; break; } } } 

这是我的docker-compose.yml。

 version: "3" services: nginx: image: nginx:latest container_name: nginx_awesome_app ports: - "8080:8080" volumes: - ./:/src - ./nginx:/etc/nginx/conf.d depends_on: - web web: build: ./ container_name: django_awesome_app volumes: - ./:/src expose: - "8080" 

这是我的start.sh。

 #!/bin/bash # PENDING: From the source here, # http://tutos.readthedocs.io/en/latest/source/ndg.html it says that it is a # common practice to have a specific user to handle the webserver. SCRIPT=$(readlink -f "$0") BASEDIR=$(dirname "$SCRIPT") DJANGO_SETTINGS_MODULE=awesome_app.settings DJANGO_WSGI_MODULE=awesome_app.wsgi NAME="awesome_app" NUM_WORKERS=3 VENV_BIN=${BASEDIR}"/venv/bin" SOCKFILE=${BASEDIR}"/run/gunicorn.sock" echo $SOCKFILE SOCKFILEDIR="$(dirname "$SOCKFILE")" VENV_ACTIVATE=${VENV_BIN}"/activate" VENV_GUNICORN=${VENV_BIN}"/gunicorn" # Activate the virtual environment. cd $BASEDIR source $VENV_ACTIVATE export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$PYTHONPATH:$BASEDIR # Create run directory if they does not exists. test -d $SOCKFILEDIR || mkdir -p $SOCKFILEDIR # Start Gunicorn! # Programs meant to be run under supervisor should not daemonize themselves # (do not use --daemon). exec ${VENV_GUNICORN} ${DJANGO_WSGI_MODULE}:application \ --bind=unix:$SOCKFILE \ --name $NAME \ --workers $NUM_WORKERS 

运行这些命令。

  • docker-compose build
  • docker-compose up -d
  • docker-compose up

给我这些错误。

 Starting django_awesome_app ... Starting django_awesome_app ... done Starting nginx_awesome_app ... Starting nginx_awesome_app ... done Attaching to django_awesome_app, nginx_awesome_app django_awesome_app | //run/gunicorn.sock django_awesome_app | /start.sh: line 25: //venv/bin/activate: No such file or directory django_awesome_app | /start.sh: line 35: //venv/bin/gunicorn: No such file or directory nginx_awesome_app | 2017/09/27 17:21:31 [emerg] 1#1: open() "/home/notalentgeek/Downloads/awesome_app/logs/nginx-access.log" failed (2: No such file or directory) nginx_awesome_app | nginx: [emerg] open() "/home/notalentgeek/Downloads/awesome_app/logs/nginx-access.log" failed (2: No such file or directory) django_awesome_app exited with code 127 nginx_awesome_app exited with code 1 

我想在这里有一些错误:

  • 如何激活virtualenv (或根本不激活)。
  • 如何在docker-compose.yml中传输volumes

此外,消息日志不会被检测到,因为我仍然有access_log /home/notalentgeek/Downloads/awesome_app/logs/nginx-access.log; 在我的nginx.conf。

我怎样才能解决这些问题?

首先,你的nginx.conf引用的东西看起来像你的主机path,而不是容器path。 nginx服务不会有/home/notalentgeek/

你没有包含你的Dockerfile,但我想象那个问题是virtualenv没有安装在Dockerfile中。 这就是为什么你得到/start.sh: line 25: //venv/bin/activate: No such file or directory错误/start.sh: line 25: //venv/bin/activate: No such file or directory

您可能会发现,通过一个示例可以帮助您更好地了解Docker的特定function以及容器的工作原理。 不幸的是,在过去的几年中,Docker的工作方式和最佳实践发生了很多变化,很多例子都会有过时的信息。 最好通过几个官方的Docker文档来阅读一些工作系统。 查看活动的Github项目可以帮助您了解开源系统如何处理Docker。

我发现nginx-proxy项目有助于将nginx放在Docker容器的前面。 该项目的自述文件有很好的说明,可以将它用作docker-compose.yml 。 使用该容器将处理nginx端,你只需要修复你的Django应用程序Dockerfile。