как настроить один контейнер, чтобы разрешить доступ всего объема к другому контейнеру, используя docker -compose - PullRequest
1 голос
/ 28 марта 2020

У меня есть 4 службы, работающие с использованием docker -compose

1) python-api 2) python-model 3) python-celery 4) redis-server.

Поток:

1) python-api получает удар через почтальона с изображениями и некоторым текстом в качестве параметров на порту 8000.

2) python-api передает изображение и данные в python-model на порт 8001 для некоторых прогнозов ML.

3) Измененные данные изображения и ответа в формате JSON затем передаются в python-celery для запуска почты.

Ошибка: python-celery может захватить изображения и ответы, отправленные python-model на шаге 3. Но в настоящее время он не может прочитать изображение

Журнал ошибок:

========================
python-celery_1      | Received task: classify_crack.tasks.queue_task_v3[d71f976f-b2e7-4b29-9147-35996668de17]
python-celery_1      | == unique_file_index
python-celery_1      | AANJkaNIJSDHURHQEYRQ(*R
python-celery_1      | /python-model/server/classify_crack/inference/images/202003251237371/202003251237371_0.jpg 64
python-celery_1      | Task classify_crack.tasks.queue_task_v3[d71f976f-b2e7-4b29-9147-35996668de17] raised unexpected: AttributeError("'NoneType' object has no attribute 'shape'",)
python-celery_1      | Traceback (most recent call last):
python-celery_1      |   File "/usr/local/lib/python3.6/site-packages/celery/app/trace.py", line 385, in trace_task
python-celery_1      |     R = retval = fun(*args, **kwargs)
python-celery_1      |   File "/usr/local/lib/python3.6/site-packages/celery/app/trace.py", line 648, in __protected_call__
python-celery_1      |     return self.run(*args, **kwargs)
python-celery_1      |   File "/python-api/classify_crack/tasks.py", line 690, in queue_task_v3
python-celery_1      |     save_heat_map_v2(predictions, img_path, _dir, unique_file_index, original_image_index, i, grid_size=grid_size, metadata=metadata, StoredFileLinks=StoredFileLinks, row_stride=row_stride, col_stride=col_stride)
python-celery_1      |   File "/python-api/classify_crack/tasks.py", line 128, in save_heat_map_v2
python-celery_1      |     num_row_splits = int(np.ceil(img.shape[0]/row_stride))
python-celery_1      | AttributeError: 'NoneType' object has no attribute 'shape'

Строка внутри python-celery кода, где я получаю сообщение об ошибке:

  img = cv2.imread(img_path)
  print(img_path)
  print(img)
  # print(img_path,grid_size)
  splits = int(np.ceil(img.shape[0]/row_stride))

Здесь img_path - допустимый путь внутри контейнера, который печатается. Но я не могу прочитать изображение, так как img возвращает None. и строка splits, сообщающая мне вышеуказанную ошибку.

Причина, по которой я получаю ошибку:

Я получаю эту ошибку, потому что она пытается Доступ к пути к папке: /python-model/server/classify_crack/inference/images/202003251237371/202003251237371.jpg, но python-celery не может получить доступ к этой папке с именем 202003251237371.

Доказательство:

Я пытался использовать команда:

command: >
      sh -c "ls '/python-model/server/classify_crack/inference/images' &&

внутри docker -компонента служб python-model и python-celery, я получаю следующий результат при повторном запуске всех контейнеров:

python-model_1       | 201801151543500
python-model_1       | 201801151543500.jpg
python-model_1       | IMG_20190307_184100
python-model_1       | IMG_20190307_184100.jpg
python-model_1       | extracted_input_0_0 (15)
python-model_1       | extracted_input_0_0 (15).jpg
python-model_1       | extracted_input_0_0 (16)
python-model_1       | extracted_input_0_0 (16).jpg
python-model_1       | extracted_input_0_0 (18)
python-model_1       | extracted_input_0_0 (18).jpg
python-model_1       | extracted_input_0_0 (19)
python-model_1       | extracted_input_0_0 (19).jpg
python-model_1       | extracted_input_0_0 (9)
python-model_1       | extracted_input_0_0 (9).jpg
python-model_1       | file
python-model_1       | image (2)
python-model_1       | image (2).png
python-model_1       | 202003251237371
python-model_1       | 202003251237371.jpg
python-model_1       | image_X
python-model_1       | image_X.png
python-model_1       | original
python-model_1       | original.jpg
python-model_1       | original_image_0
python-model_1       | original_image_0.jpg



python-celery_1      | 20013V_Y.JPG
python-celery_1      | extracted_input_0_0 (15).jpg
python-celery_1      | extracted_input_0_0 (16).jpg
python-celery_1      | extracted_input_0_0 (18).jpg
python-celery_1      | extracted_input_0_0 (19).jpg
python-celery_1      | extracted_input_0_0 (4).jpg
python-celery_1      | 202003251237371.jpg

Теперь ясно, python-celery не может отобразить папку 202003251237371 с именем изображения 202003251237371.jpg, которое я видел в python-model.

Как решить этот сценарий и разрешить python-celery доступ к таким папки с изображениями?

docker -составить

version: "3"
networks:
  app-tier:
    driver: bridge

volumes:
  app-volume: {}

services:
  python-api-celery: &python-api-celery
    build:
      context: /Users/AjayB/Desktop/python-api/
    networks:
      - app-tier
    volumes:
      - app-volume:/python-model/server/classify_crack/:rw
    environment:
      - PYTHON_API_ENV=development

    command: >
      sh -c "python manage.py makemigrations &&
             python manage.py migrate"

  python-api: &python-api
    <<: *python-api-celery
    ports:
      - "8000:8000"
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000"

  python-celery: &python-celery
    <<: *python-api-celery
    depends_on:
      - redis
    links:
      - python-model

    command: >
      sh -c "ls '/python-model/server/classify_crack/inference/images' &&
             celery -A server worker -l info"

  redis:
    image: redis:5.0.8-alpine
    hostname: redis
    networks:
          - app-tier
    expose:
      - "6379"
    volumes:
      - app-volume:/python-model/server/classify_crack/:rw
    ports:
      - "6379:6379"
    command: ["redis-server"]

  python-model: &python-model
    build:
      context: /Users/AjayB/Desktop/Python/python/
    ports:
      - "8001:8001"
    networks:
      - app-tier
    environment:
      - PYTHON_API_ENV=development
    volumes:
      - app-volume
    depends_on:
      - python-api
    command: >
      sh -c "ls '/python-model/server/classify_crack/inference/images' &&
             cd /python-model/server/ &&
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8001"

Экземпляр контейнеров:

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
7374a7b0b051        integrated_python-celery       "sh -c 'celery -A se…"   13 minutes ago      Up 5 seconds        8000/tcp                 integrated_python-celery_1
8eb9a754996a        integrated_python-model        "sh -c 'cd /python-m…"   20 minutes ago      Up 5 seconds        0.0.0.0:8001->8001/tcp   integrated_python-model_1
b268b7bd1ac4        integrated_python-api-celery   "sh -c 'python manag…"   20 minutes ago      Up 6 seconds        8000/tcp                 integrated_python-api-celery_1
869bb5fc21b2        integrated_python-api          "sh -c 'python manag…"   20 minutes ago      Up 6 seconds        0.0.0.0:8000->8000/tcp   integrated_python-api_1
c85a1becea34        redis:5.0.8-alpine             "docker-entrypoint.s…"   About an hour ago   Up 6 seconds        0.0.0.0:6379->6379/tcp   integrated_redis_1

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Из OpenCV- Python do c: `

Даже если путь к изображению неправильный, он не выдаст никакой ошибки, но напечатает img не даст вам None

Что, кажется, именно то, что здесь происходит. Возможно, ваш путь к изображению кажется правильным, но на самом деле неправильным, возможные причины:

  • Вы используете неверный относительный или абсолютный путь
  • Файл изображения существует, но он недействителен
  • Права на папку или файл /python-model/server/classify_crack/inference/images/202003251237371/202003251237371.jpg не позволяют пользователю, выполняющему python-celery, прочитать его

В противном случае определение тома Compose выглядит нормально.

1 голос
/ 03 апреля 2020

Ошибка, наконец, решена:

Работает с включением следующих строк в python -api views.py при запуске:

    self.cur_file_dir_path = '/data/'
    self.cur_file_folder_path = '/'.join(file_path.split('/')[:-1])
    if not os.path.exists('{}/inference'.format(self.cur_file_folder_path)):
      os.makedirs('{}/inference'.format(self.cur_file_folder_path))

также, изменено имя тома в docker-compose, просто чтобы избежать путаницы. Не могу поверить, что потребовалась почти 1 неделя, чтобы решить это.

docker -составить:

version: "3"

networks:
  app-tier:
    driver: bridge

volumes:
  app-volume: {}

services:
  python-api-celery: &python-api-celery
    build:
      context: /Users/AjayB/Desktop/python-api/
    networks:
      - app-tier
    volumes:
      - app-volume:/data/:rw
    environment:
      - PYTHON_API_ENV=development

    command: >
      sh -c "python manage.py makemigrations &&
             python manage.py migrate"

  python-api: &python-api
    <<: *python-api-celery
    ports:
      - "8000:8000"
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000"

  python-celery: &python-celery
    <<: *python-api-celery
    depends_on:
      - redis
    command: >
      sh -c "ls '/data/' &&
             celery -A server worker -l info"

  redis:
    image: redis:5.0.8-alpine
    hostname: redis
    networks:
          - app-tier
    expose:
      - "6379"
    volumes:
      - app-volume:/data/:rw
    ports:
      - "6379:6379"
    command: ["redis-server"]

  python-model: &python-model
    build:
      context: /Users/AjayB/Desktop/Python/python/
    ports:
      - "8001:8001"
    networks:
      - app-tier
    environment:
      - PYTHON_API_ENV=development
    volumes:
      - app-volume:/data/:rw
    depends_on:
      - python-api

    command: >
      sh -c "ls '/data/' &&
             cd /python-model/server/ &&
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8001"
1 голос
/ 02 апреля 2020

По моему мнению, вы должны следовать подробному руководству о том, как использовать сельдерей с python API с Docker и Kubernetes :)

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