2017-08-25 4 views
0

Ich habe ein Tutorial für Django und Docker mit nginx hier http://ruddra.com/2016/08/14/docker-django-nginx-postgres/ folgen. aber ich habe eine andere VM mit einem freiliegenden Hafen von 8000, so habe ich es zu 8100 aber verließ die andere bei 8000docker komponieren Django nginx

das ist mein compose Datei:

version: '3' 
services: 
    nginx: 
    image: nginx:latest 
    container_name: ngnix01 
    ports: 
     - "8100:8000" 
    volumes: 
     - ./code:/code 
     - ./config/nginx:/etc/nginx/conf.d 
    depends_on: 
     - web 
    web: 
    build: . 
    container_name: django01 
    command: bash -c "python manage.py makemigrations && python manage.py migrate && gunicorn mydjango.wsgi -b 0.0.0.0:8000" 
    depends_on: 
     - db 
    volumes: 
     - ./code:/code 
    expose: 
     - "8000" 
    db: 
    image: postgres:latest 
    container_name: postgres01 

nginx config:

upstream web { 
    ip_hash; 
    server web:8000; 
} 

server { 

    location /static/ {  
     autoindex on;  
     alias /static/; 
    } 

    location/{ 
     proxy_pass http://web/; 
    } 
    listen 8000; 
    server_name localhost; 
} 

und ich erhalte die Fehlermeldung, wenn ich Andockfenster-komponieren bis

attaching to postgres01, django01, ngnix01 
django01 | Traceback (most recent call last): 
django01 | File "manage.py", line 8, in <module> 
ngnix01 | 2017/08/25 10:25:01 [emerg] 1#1: host not found in upstream "web:8000" in /etc/nginx/conf.d/django.conf:3 
django01 |  from django.core.management import execute_from_command_line 
ngnix01 | nginx: [emerg] host not found in upstream "web:8000" in /etc/nginx/conf.d/django.conf:3 
django01 | ModuleNotFoundError: No module named 'django.core' 
django01 exited with code 1 

, die mich denken lässt, nginx kann nicht con Takt Einhorn an Port 8000? Ich denke, meine Kompositionsdatei ist korrekt? Port auf der linken Seite ist Port zu offenbaren, Port auf der rechten Seite ist die im Container?

Oder sprechen sie bei mehreren Bildern extern miteinander?

Dank

EDIT: enthalten dockerfile

#set base image 
FROM python:latest 
ENV PYTHONUNBUFFERED 1 

#install dependencies 

RUN sed -i "s#jessie main#jessie main contrib non-free#g" /etc/apt/sources.list 

RUN apt-get update -y \ 
    && apt-get install -y apt-utils python-software-properties libsasl2-dev python3-dev libldap2-dev libssl-dev libsnmp-dev snmp-mibs-downloader 

ENV APP_USER itapp 
ENV APP_ROOT /code 
RUN mkdir /code; 
RUN groupadd -r ${APP_USER} \ 
    && useradd -r -m \ 
    --home-dir ${APP_ROOT} \ 
    -s /usr/sbin/nologin \ 
    -g ${APP_USER} ${APP_USER} 

WORKDIR ${APP_ROOT} 

RUN mkdir /config 
ADD config/requirements.txt /config/ 
RUN pip install -r /config/requirements.txt 

USER ${APP_USER} 
ADD . ${APP_ROOT} 
+0

Ja, Ihre Datei korrekt zu sein scheint. Wenn Sie eine Hostadresse als Dienstname angeben, versuchen andere Dienste im Stapel, eine Verbindung mit dem offengelegten Port des Dienstes (d. H. Intern - 8000) herzustellen. Ich denke, das Problem im Django-Container verursacht Nginx den Host zu verlieren, weil Django schnell getötet wird. Docker gibt mir manchmal die Gänsehaut ... –

+0

Haben Sie isolierte Tests für Ihre App? Sie können sie in Dockerfile ausführen, dann sehen Sie, ob bei der Erstellung eines Abbilds vor der eigentlichen Bereitstellung etwas schief geht. So etwas wie: 'RUN python manage.py test --settings = app.settings.test -v2' –

Antwort

1

der Fehler kommt, weil es kein Modul django im Bild Sie den Befehl hinzufügen installiert ist -r requirements.txt installieren pip oder Befehl pip installieren Django in Befehl hinzufügen: bash Abschnitt Bild web

version: '3'
services:
nginx: image: nginx:latest container_name: ngnix01 ports: - "8100:8000" volumes: - ./code:/code - ./config/nginx:/etc/nginx/conf.d depends_on: - web networks: - default web: build: . container_name: django01 command: bash -c "pip install Django && cd /home/docker/code python manage.py makemigrations && python manage.py migrate && gunicorn mydjango.wsgi -b 0.0.0.0:8000" depends_on: - db volumes: - ./code:/code expose: - "8000" networks: - default db: image: postgres:latest container_name: postgres01 networks: - default networks: default:

+0

auch müssen Sie den Befehl nach dem Pip-Befehl" cd/home/docker/code/"hinzufügen, um zu Ihrem Code-Verzeichnis –

+0

Ich habe Django bereits über die requirements.txt in der Docker-Datei installiert und habe das – AlexW

+0

gebaut Aber aus dem Protokoll, das Sie angegeben haben, sehe ich diesen Fehler >>> django01 | ModuleNotFoundError: Kein Modul mit dem Namen 'django.core' <<< es ist, weil Sie Django nicht installiert haben oder Python kann Django Modul nicht finden, wenn Sie versuchen, –

0

Vielleicht müssen Sie Ihre drei Container mit demselben Netzwerk verbinden.

Versuchen Sie Docker-compose.yml wie diese Bearbeitung:

version: '3' 
services: 
    nginx: 
    image: nginx:latest 
    container_name: ngnix01 
    ports: 
     - "8100:8000" 
    volumes: 
     - ./code:/code 
     - ./config/nginx:/etc/nginx/conf.d 
    depends_on: 
     - web 
    networks: 
    - default 
    web: 
    build: . 
    container_name: django01 
    command: bash -c "python manage.py makemigrations && python  manage.py migrate && gunicorn mydjango.wsgi -b 0.0.0.0:8000" 
    depends_on: 
     - db 
    volumes: 
     - ./code:/code 
    expose: 
     - "8000" 
    networks: 
    - default 
    db: 
    image: postgres:latest 
    container_name: postgres01 
    networks: 
    - default 
networks: 
    default: