也许我的做法是错误的,但我似乎无法在运行自定义 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/