Общий объем между контейнерами Docker с кодом Python - PullRequest
0 голосов
/ 08 ноября 2018

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

Я использую следующий docker-compose.yml:

version: "2"

services:
    rabbitmq:
        image: username/rabbitmq
        ports:
            - 15672:15672
            - 5672:5672
    producer:
        image: username/producer
        depends_on:
            - rabbitmq
        volumes:
            - pdffolder:/temp
    consumer:
        image: username/consumer
        depends_on:
            - producer
        volumes:
            - pdffolder:/temp
volumes:
    pdffolder:

Идея состоит в том, что служба производителя опрашивает сервер обмена для получения информации и pdf-файла. Затем служба поддержки должна отправить эту информацию и файл PDF в другое место. Во время этого действия я должен временно сохранить pdf локально.

Я получаю доступ к томам из пользовательского кода Python следующим образом:

производитель

# attachment = object I get when requesting attachments from an exchange server

# path to pdf to be saved
pdf_path = os.path.join("temp", attachment.name)

with open(pdf_path, 'wb') as f:
    f.write(attachment.content)

# now in this container, /temp/attachment.pdf exists. I then send this path in a message to the consumer (along with other information)

Потребитель

# consumer tries to find path created by producer (/temp/attachment.pdf) via
pdf_path = os.path.join("temp", "attachment.pdf")

Через командную строку я вижу, что контейнер-производитель записывает файлы в temp / attachment.pdf, как и ожидалось. Однако потребительский контейнер не видит файлов (что приводит к ошибкам).

Кстати, я запускаю контейнеры в докере для Windows

1 Ответ

0 голосов
/ 12 ноября 2018

Кажется, я понял, что случилось. Я использовал следующее в файлах Docker для производителя и потребителя:

FROM python:3.7-slim
WORKDIR /main
ADD . /main
RUN pip install --trusted-host pypi.python.org -r requirements.txt
CMD ["python", "-u", "main.py"]

Поскольку я переместил код python в папку / main в обоих контейнерах, созданная позже временная папка (с помощью docker-compose) должна была быть найдена в / main / temp, а не просто / temp. Немного странно, потому что main.py должен быть на том же уровне, что и / temp, но эй, это работает. Я получил это работает со следующим docker-compose.yml:

version: "2"

services:
    rabbitmq:
        image: username/rabbitmq
        ports:
            - 15672:15672
            - 5672:5672
    producer:
        image: username/producer
        depends_on:
            - rabbitmq
        volumes:
            - pdffolder:/main/temp
    consumer:
        image: username/consumer
        depends_on:
            - producer
        volumes:
            - pdffolder:/main/temp
volumes:
    pdffolder:

Итак, я думаю, что шаги для отладки это:

  • Проверьте правильность написания всех упоминаний томов в файле docker-compose.yml
  • Проверьте, как пути строятся / ссылаются в коде Python (Linux использует другой формат для Windows)
  • Проверьте, действительно ли существуют пути, к которым нужно получить доступ из кода Python
...