使用 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代码必须访问的路径是否确实存在
也许我做错了,但我似乎无法让两个 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代码必须访问的路径是否确实存在