[英]docker-compoes.yml settings with Django + Gunicorn + NGINX does not work on `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
如何激活(或完全不激活)。 volumes
如何在docker-compose.yml中傳輸。 此外,將消息轉到容器時未檢測到消息日志,因為我仍然具有access_log /home/notalentgeek/Downloads/awesome_app/logs/nginx-access.log;
在我的nginx.conf中。
我該如何解決這些問題?
首先,您的nginx.conf
將引用看起來像主機路徑的內容,而不是容器路徑的內容。 在nginx
服務不會有/home/notalentgeek/
。
您尚未包括Dockerfile,但我想這個問題是Dockerfile中未安裝virtualenv。 這就是為什么出現錯誤/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在特定情況下以及常規容器的工作方式。 不幸的是,在過去的幾年中,Docker的工作方式和最佳實踐發生了很多變化,因此很多示例都已經過時了。 最好通讀一些文檔以及Docker官方文檔,以構成一個工作系統。 仔細研究活躍的Github項目可以幫助您了解開源系統如何處理Docker。
我發現nginx-proxy項目有助於將nginx放在Docker容器之前。 該項目的自述文件具有將其用作docker-compose.yml
良好說明。 使用該容器將處理nginx方面,而您只需要修復Django應用Dockerfile。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.