使用 python 代码在 Docker 个容器之间共享卷

Shared volume between Docker containers with python code

也许我做错了,但我似乎无法让两个 docker 容器之间的共享卷工作 运行 自定义 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。然而,消费者容器看不到任何文件(导致错误)。

顺便说一句,我是 运行 docker 上 windows

的容器

我想我知道出了什么问题。我在生产者和消费者的 Dockerfile 中都使用了以下内容:

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 代码中 built/referenced 的方式(Linux 使用与 windows 不同的格式)
  • 检查python代码必须访问的路径是否确实存在