Проблема запуска сценариев запуска для контейнеров - PullRequest
1 голос
/ 31 мая 2019

Я пытаюсь запустить три docker-контейнера, используя docker-compose; база данных postgresql, остальные API и веб-приложение.

Раньше у меня были остальные API и база данных, которые работали отлично (запустили миграцию и запустили сервер), но когда я захотел отправить ему запросы из моего веб-приложения, у меня возникли проблемы с подключением к сети докеров. Все обсуждения в Интернете были посвящены подключению веб-приложения в контейнере к API в другом контейнере, и я не нашел многообещающего метода для подключения к нему (кроме включения переадресации портов в ядре и раскрытия себя в сети? ) поэтому я просто решил упаковать веб-приложение в контейнер.

Моя структура каталогов:

ProjectName
|-> projectapi
|-> |-> api.docker
|-> |-> api_start.sh
|-> projectapp
|-> |-> front.docker
|-> |-> front_start.sh
|-> docker-compose.yml

Проблема заключается в запуске этих сценариев запуска в правильном контексте (мне нужно только запустить npm start и python manage.py runserver).

Я не могу придумать ничего из того, что не пробовал, но большинство моих усилий было сосредоточено на поиске путей, потому что долгое время проблема не заключалась в поиске файла, который, я думаю, я исправил.

Это файл docker-compose, я попытался использовать здесь все виды command записей для запуска желаемого сценария запуска. Я также использовал entrypoint.

version: '3.7'

services:
  db:
    container_name: projectdb
    image: postgres:9.6-alpine
    restart: always
    volumes:
      - projectdb:/var/lib/postgresql/data/
    environment:
      POSTGRES_DB: projectdb
      POSTGRES_PASSWORD: root
    ports:
      - "8001:5432"

  api:
    container_name: projectapi
    build:
      context: projectapi/
      dockerfile: api.docker
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db
    restart: always
    environment:
      POSTGRES_DB: 'projectdb'
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'root'
      POSTGRES_HOST: 'db'

  front:
    container_name: projectapp
    build:
      context: projectapp/
      dockerfile: front.docker
    ports:
      - "3000:3000"
    restart:
      always


volumes:
  projectdb:

Тогда есть Dockerfiles:

передняя

FROM node:8
RUN mkdir /projectapp
COPY $HOSTDIR/package*.json /projectapp/
RUN npm install /projectapp
COPY $HOSTDIR/* /projectapp/
ENTRYPOINT ["npm", "start", "/projectapp"]

назад

FROM python:3.6-slim

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1

RUN mkdir /projectapi
COPY $HOSTDIR/requirements.txt /projectapi/
RUN pip install -r /projectapi/requirements.txt
COPY $HOSTDIR/* /projectapi/
CMD ["python", "manage.py", "migrate"]

Последняя строка также может быть runserver. Это лишь некоторые примеры перестановок, которые я прошел, но на данный момент я чувствую, что проблема заключается в некотором концептуальном недоразумении, я прочитал документы.

Все сообщения об ошибках - это разные варианты не при запуске скрипта запуска. Я думаю, что был момент, когда мне удалось запустить сценарий запуска, и ошибка стала невозможностью найти manage.py, после чего я начал изучать, как написать сценарий лучше, чем просто: python manage.py runserver но не сделал ' очень далеко.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Я решил эту проблему, но сеть так и не заработала, но это другой вопрос.Хотя я решил проблему со сценариями запуска, оказалось, что она не нужна, вот текущее состояние:

Структура каталогов такая же, как и раньше.

docker-compose.yml

version: '3.7'

services:
  db:
    container_name: compdb
    image: postgres:9.6-alpine
    restart: always
    volumes:
      - compdb:/var/lib/postgresql/data/
    environment:
      POSTGRES_DB: compdb
      POSTGRES_PASSWORD: root
    networks:
      - internal
    ports:
      - "8001:5432"

  api:
    container_name: back
    build:
      context: back/
      dockerfile: api.docker
    entrypoint: ["python", "/back/manage.py", "runserver", "0.0.0.0:8000"]
    networks:
      - internal
    ports:
      - "8000:8000"
    expose:
      - "8000"
    depends_on:
      - db
    restart: always
    environment:
      POSTGRES_DB: 'compdb'
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'root'
      POSTGRES_HOST: 'db'

  front:
    container_name: front
    build:
      context: front/
      dockerfile: front.docker
    entrypoint: ["npm","start", "--prefix", "/front/"]
    networks:
      - internal
    ports:
      - "3000:3000"
    expose:
      - "3000"
    depends_on:
      - api
    restart:
      always

  staff:
    container_name: staff
    build:
      context: staff/
      dockerfile: staff.docker
    entrypoint: ["npm","start","--prefix","/staff/"]
    networks:
      - internal
    ports:
      - "3006:3006"
    expose:
      - "3006"
    depends_on:
      - api
    restart:
      always

volumes:
  compdb:

networks:
  internal:

спереди

FROM node:8
RUN mkdir /front
COPY package*.json /front/
RUN npm install /front
COPY . /front/

сзади

FROM python:3.6-slim

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONBUFFERED 1

RUN mkdir /back
COPY requirements.txt /back/
RUN pip install -r /back/requirements.txt
COPY . /back/

Персонал похож на фронт.

Проблема была решена путем перемещения контекста сборки вкаждый каталог с докером составляют.Запуск сценариев запуска может быть выполнен путем изменения точки входа, однако для локальной разработки подключение к контейнеру для запуска миграций или аналогичных операций более удобно.

0 голосов
/ 31 мая 2019

Попробуйте использовать WORKDIR. Ваш текущий путь выполнения не имеет manage.py -

Я попытался изменить его на мгновение -

WORKDIR /projectapi
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "manage.py", "runserver"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...