【问题标题】:Run Python package with multiple .py scripts in docker-compose.yml在 docker-compose.yml 中运行带有多个 .py 脚本的 Python 包
【发布时间】:2020-07-29 16:55:59
【问题描述】:

总结问题:

Python 包基本上在批处理文件夹中打开 PDF,读取每个 PDF 的第一页,匹配关键字,并将兼容的 PDF 转储到源文件夹中以供 OCR 脚本启动。获取所有 PDF 的第一个脚本是 MainBankClass .py。我正在尝试使用 docker-compose 文件将所有这些 python 脚本包含在同一 networkvolume 下,以便每个 OCR 脚本在预处理完成。 This link 是迄今为止最接近实现目标的,但似乎我错过了其中的某些部分。调用不同OCR脚本的过程是由runpy.run_path(path_name='ChaseOCR.py')实现的,因此这些脚本在__init__.py的同一目录下。这是文件系统结构:

BankStatements
 ┣ BankofAmericaOCR
 ┃ ┣ BancAmericaOCR.py
 ┃ ┗ Dockerfile.bankofamerica
 ┣ ChaseBankStatementOCR
 ┃ ┣ ChaseOCR.py
 ┃ ┗ Dockerfile.chase
 ┣ WellsFargoStatementOCR
 ┃ ┣ Dockerfile.wellsfargo
 ┃ ┗ WellsFargoOCR.py
 ┣ BancAmericaOCR.py
 ┣ ChaseOCR.py
 ┣ Dockerfile
 ┣ WellsFargoOCR.py
 ┣ __init__.py
 ┗ docker-compose.yml

到目前为止我所做的尝试:

在 docker-compose.yml 中:

version: '3'

services:
    mainbankclass_container:
        build: 
            context: '.'
            dockerfile: Dockerfile
        volumes: 
            - /Users:/Users
        #links:
        #    - "chase_container"
        #    - "wellsfargo_container"
        #    - "bankofamerica_container"
    chase_container:
        build: .
        working_dir: /app/ChaseBankStatementOCR
        command: ./ChaseOCR.py
        volumes: 
            - /Users:/Users
    bankofamerica_container:
        build: .
        working_dir: /app/BankofAmericaOCR
        command: ./BancAmericaOCR.py
        volumes: 
            - /Users:/Users
    wellsfargo_container:
        build: .
        working_dir: /app/WellsFargoStatementOCR
        command: ./WellsFargoOCR.py
        volumes: 
            - /Users:/Users

每个银行文件夹下的每个 dockerfile 都是相似的,除了 CMD 会相应地更改。例如,在 ChaseBankStatementOCR 文件夹中:

FROM python:3.7-stretch
WORKDIR /app
COPY . /app
CMD ["python3", "ChaseOCR.py"] <---- changes are made here for the other two bank scripts

最后一个元素是每个文件夹之外的 Dockerfile:

FROM python:3.7-stretch
WORKDIR /app
COPY ./requirements.txt ./ 
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
RUN pip3 install --upgrade PyMuPDF

COPY . /app

COPY ./ChaseOCR.py /app
COPY ./BancAmericaOCR.py /app
COPY ./WellsFargoOCR.py /app

EXPOSE 8080

CMD ["python3", "MainBankClass.py"]

运行docker-compose build后,容器和网络搭建成功。当我运行docker run -v /Users:/Users: python3 python3 ~/BankStatementsDemoOCR/BankStatements/MainBankClass.py 时发生错误,错误消息是 FileNotFoundError: [Errno 2] No such file or directory: 'BancAmericaOCR.py'

我假设容器没有 BancAmericaOCR.py,但我在同一个网络下编写了每个 .py 文件,我认为 links 不是一个好习惯,因为 docker 建议使用 networks @ 987654322@。我在这里想念什么?任何帮助深表感谢。提前致谢。

【问题讨论】:

  • 由于 Docker 在设计上将容器文件系统与主机隔离开来,因此不太适合专注于本地文件的进程。 Docker Compose 也更多地为长时间运行的进程而设计,而不是为完成某些工作单元然后退出的批处理作业而设计。我可以在没有 Docker 的情况下在 Python 虚拟环境中运行它,由 shell 脚本或 Python 原生驱动程序驱动。
  • 您是否建议在每个文件夹之外添加xx.sh,然后将CMD 更改为["python3", "./xx.sh"]? @大卫迷宫
  • 我建议 using a Python virtual environment 并且根本不使用 Docker,因为你已经描述了这个问题。
  • 我只制作一个 Python 容器...然后使用 Flask,例如通过 REST API 操作动态运行各个解析器函数
  • @OneCricketeer 感谢您的宝贵时间和宝贵意见。是的,我们目前正在运行 1 个容器,当时我在考虑这个问题。

标签: python python-3.x docker docker-compose dockerfile


【解决方案1】:

单个容器中的单个应用程序...需要不同 py 文件进行通信的网络

您只有一个容器。 Docker 网络用于多个容器相互通信。并且 Docker Compose 为所有服务定义了一个默认的桥接网络,因此如果您仍在使用 docker-compose,则不需要它

这是一个清理过的 Dockerfile,其中复制了所有脚本,并添加了一个入口点文件

FROM python:3.7-stretch
WORKDIR /app
COPY ./requirements.txt ./  
RUN pip3 install --upgrade pip PyMuPDF && pip3 install -r requirements.txt

COPY . /app

COPY ./docker-entrypoint.sh /
ENTRYPOINT /docker-entrypoint.sh

在你的入口点,你可以遍历每个文件

#!/bin/bash

for b in Chase WellsFargo BofA ; do 
    python3 /app/$b.py
done

exec python3 /app/MainBankClass.py

【讨论】:

  • 我正在使用您的输入进行快速测试,并会尽快更新您。
  • 我在修改 for 循环以匹配正确的 py 文件名后收到 permission denied 错误
  • 在 dockerfile 中添加 RUN ["chmod", "+x", "/app/docker_entrypoint.sh"] 以使其可执行时仍然收到 permission denied 错误
  • 您需要在 Dockerifle 之外进行 chmod。我提供的 Dockerfile 不需要更改任何内容
  • Dockerfile 之外是什么意思?在终端中执行那个 shell 脚本?
【解决方案2】:

因此,在对我的案例进行了几天的搜索后,我将关闭此线程,并在 docker 论坛的this link 上建议实现单个容器中的单个应用程序。建议的方法不是使用 docker-compose,而是为此应用程序使用 1 个带有 dockerfile 的容器,并且它按预期工作。

在 dockerfile 之上,我们还需要 networks 让不同的 py 文件进行通信。例如:

docker network create my_net
docker run -it --network my_net -v /Users:/Users --rm my_awesome_app

编辑: 因为我们只运行一个容器,所以不需要网络。

编辑 2: 请参阅已接受的答案以供将来参考

如果有人对此案有更好的想法,欢迎任何答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多