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

标签 python docker volume

也许我的做法是错误的,但我似乎无法在运行自定义 python 代码的两个 docker 容器之间获得共享卷。

我正在使用以下 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 的 docker 上运行容器

最佳答案

我想我已经知道出了什么问题了。我在生产者和消费者的 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 代码中构建/引用路径的方式(Linux 使用与 Windows 不同的格式)
  • 检查Python代码需要访问的路径是否确实存在

关于python - 使用 python 代码在 Docker 容器之间共享卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197738/

相关文章:

python - 如何拆分数据框中的列并将其替换为新列

python - Mrjob 无法在 dataproc 上创建集群 : __init__() got an unexpected keyword argument 'channel'

docker - 创建前检查错误: “This computer doesn'已启用VT-X/AMD-v。即使已启用它,也必须在BIOS中启用它

macos - 使用 Tascam US-144MKII 读取 CoreAudio 输入电平

Android AudioTrack 对象不会播放安静的正弦信号(低于大约 15 分贝)

Python:获取 Pandas 系列列表长度的有效方法

python - 如何将 value_counts() 输出转换为数据帧?

docker - 如何从主机访问容器的 Web 应用程序

docker - 如何在 docker 容器中运行 Symfony 控制台命令

audio - 如何使用 ffmpeg 确定哪个音频文件的音量更大?