Запустите Docker-контейнер и запустите проект Django одновременно - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующий docker-compose.yml файл, который работает без проблем:

version: '2'
services:
  nginx:
    image: nginx:latest
    container_name: nz01
    ports:
      - "8001:8000"
    volumes:
      - ./src:/src
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
      - web
  web:
    build: .
    container_name: dz01
    depends_on:
      - db
    volumes:
      - ./src:/src
    expose:
      - "8000"
  db:
    image: postgres:latest
    container_name: pz01
    ports:
        - "5433:5432"
    volumes:
      - postgres_database:/var/lib/postgresql/data:Z
volumes:
    postgres_database:
        external: true

Проблема в том, что я запускаю docker-compose up Я получаю эту ошибку:

python: can't open file 'manage.py': [Errno 2] No such file or directory
python: can't open file 'manage.py': [Errno 2] No such file or directory
[2018-10-26 12:41:59 +0000] [8] [INFO] Starting gunicorn 19.7.1
[2018-10-26 12:41:59 +0000] [8] [INFO] Listening at: http://0.0.0.0:8000 (8)
[2018-10-26 12:41:59 +0000] [8] [INFO] Using worker: sync
[2018-10-26 12:41:59 +0000] [12] [INFO] Booting worker with pid: 12
[2018-10-26 12:41:59 +0000] [12] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 578, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 126, in init_process
    self.load_wsgi()
  File "/usr/local/lib/python2.7/site-packages/gunicorn/workers/base.py", line 135, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/usr/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/local/lib/python2.7/site-packages/gunicorn/util.py", line 352, in import_app
    __import__(module)
ImportError: No module named C.wsgi
[2018-10-26 12:41:59 +0000] [12] [INFO] Worker exiting (pid: 12)
[2018-10-26 12:41:59 +0000] [8] [INFO] Shutting down: Master
[2018-10-26 12:41:59 +0000] [8] [INFO] Reason: Worker failed to boot.

IЯ знаю, что это потому, что в моей папке src не существует django-проекта C, но я попытался автоматически создать его в dockerfile с помощью этого сценария:

FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /src
RUN mkdir /static
WORKDIR /src
ADD ./src /src
RUN pip install -r requirements.pip
RUN django-admin startproject C
WORKDIR /C
CMD python manage.py collectstatic --no-input;python manage.py migrate; gunicorn C.wsgi -b 0.0.0.0:8000

Сначала я выполняю docker-составьте сборку, и она работает без ошибок:

docker-compose build
db uses an image, skipping
Building web
Step 1/10 : FROM python:2.7
 ---> 3c43a5d4034a
Step 2/10 : ENV PYTHONUNBUFFERED 1
 ---> Using cache
 ---> da201dd581f7
Step 3/10 : RUN mkdir /src
 ---> Using cache
 ---> 30938986b6e0
Step 4/10 : RUN mkdir /static
 ---> Using cache
 ---> ccc265f2cb16
Step 5/10 : WORKDIR /src
 ---> Using cache
 ---> 9886c1215843
Step 6/10 : ADD ./src /src
 ---> Using cache
 ---> 4b4861dc6d8d
Step 7/10 : RUN pip install -r requirements.pip
 ---> Using cache
 ---> e57283657840
Step 8/10 : RUN django-admin startproject bmat
 ---> Running in 0b25e38d9edd
Removing intermediate container 0b25e38d9edd
 ---> 1b39be297aac
Step 9/10 : WORKDIR /bmat
Removing intermediate container 5ed83a067b98
 ---> 9fd466c2d795
Step 10/10 : CMD python manage.py collectstatic --no-input;python manage.py migrate; gunicorn bmat.wsgi -b 0.0.0.0:8000
 ---> Running in 3beba0b212f0
Removing intermediate container 3beba0b212f0
 ---> d83eb0913d98
Successfully built d83eb0913d98
Successfully tagged bmat_web:latest
nginx uses an image, skipping

Затем я запускаю docker-compose up -d, который возвращает, что все контейнеры работают, но при переходе к kinematic я обнаружил, что эта проблема упомянута выше, и этопотому что django-admin startproject C не работает.

Есть опция, позволяющая автоматически запускать его при сборке контейнера Docker?Вероятно, лучший вариант - использовать первую версию dockerfile, не выполняя ничего для каркаса, собрать все контейнеры, создать проект и затем вручную изменить dockerfile, чтобы добавить соответствующие функции миграции и collectstatic.

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Наконец-то у меня все работает.Благодаря @DavidMaze я исправил первую ошибку, но она не решила генерацию проекта django.

Последний скрипт:

FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /src
RUN mkdir /static
WORKDIR /src
ADD ./src /src
RUN pip install -r requirements.pip
CMD django-admin.py startproject bmat; cd /src/bmat; python manage.py collectstatic --no-input;python manage.py migrate; gunicorn bmat.wsgi -b 0.0.0.0:8000

Теперь оператор Run django-admin не выполняется в Docker, но с использованием CMD внутри работающего контейнера.

0 голосов
/ 26 октября 2018

Я подозреваю, что ваша большая проблема заключается в том, что Dockerfile заканчивается на:

WORKDIR /C
CMD python manage.py ...

Но в /C вообще ничего нет, все (я догадываюсь) в /src/C.Попробуйте вместо этого

WORKDIR /src/C

Отдельно ваш файл docker-compose.yml говорит:

volumes:
  - ./src:/src

, который скрывает все в /src в контейнере и заменяет его на то, что происходит в ./src на хосте.В частности, это заменяет почти все, что делает ваш Dockerfile.Несмотря на то, что это достаточно распространенная настройка разработки (она позволяет избежать повторного запуска docker build после внесения изменений и запуска тестов), это не то, что вы на самом деле запускаете в рабочей среде (вы хотите иметь возможность использовать изображение изолированно безкопирование отдельно вокруг исходного дерева).

Попробуйте удалить эти две строки и использовать копию дерева, которое на самом деле находится в изображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...