繁体   English   中英

在 docker-compose.yml 中运行 Python package 和 multiple.py 脚本

[英]Run Python package with multiple .py scripts in docker-compose.yml

总结问题:

Python package 基本上在批处理文件夹中打开 PDF,读取每个 PDF 的第一页,匹配关键字,并将兼容的 PDF 转储到源文件夹中以供 OCR 脚本启动。第一个获取所有 PDF 的脚本是MainBankClass.py 我正在尝试使用 docker-compose 文件将所有这些 python 脚本包含在同一网络下,以便每个 OCR 脚本在预处理完成后开始扫描银行对帐单。 这个链接是迄今为止最接近实现目标的链接,但似乎我错过了其中的某些部分。 调用不同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后,容器和.network构建成功。 当我运行docker run -v /Users:/Users: python3 python3 ~/BankStatementsDemoOCR/BankStatements/MainBankClass.py时出现错误,错误消息是FileNotFoundError: [Errno 2] No such file or directory: 'BancAmericaOCR.py'

我假设容器没有 BancAmericaOCR.py,但我已经在 same.network 下编写了 each.py 文件,我认为links不是一个好习惯,因为 docker 建议在此处使用networks 我在这里错过了什么? 任何帮助深表感谢。 提前致谢。

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

你只有一个容器。 Docker.networks 用于多个容器相互通信。 并且 Docker Compose 为所有服务定义了默认的 bridge.network,因此如果您仍在使用 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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM