[英]what is a bare-bones Dockerfile/docker-compose.yml to run python scripts (with specific versions of python/packages)
[英]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.