docker - 库 wkhtmltopdf 在 Docker 中不工作

标签 docker flask wkhtmltopdf pdfkit

我在 Python Flask 中有一段代码,我在其中使用 HTML 模板生成 pdf 文件。当我单独运行代码时,代码工作得很好,但是当我尝试在 Docker 容器中运行它时,只要我调用生成报告的端点,docker 就会崩溃并重置。它只是保持加载然后返回错误(在我用来测试的 Postman 中)。

PDF的代码如下:

def create_report(download_uuid):
    transactions = get_transaction_for_report(download_uuid)
    config = pdfkit.configuration(wkhtmltopdf=environ.get('WKHTMLTOPDF'))

    file_obj = io.BytesIO()
    with zipfile.ZipFile(file_obj, 'w') as zip_file:
        for transaction in transactions:
            html = render_template("report.html", transaction=transaction)
            pdf = pdfkit.from_string(html, False, configuration=config)
            data = zipfile.ZipInfo('{}.pdf'.format(transaction['control_number']))
            data.compress_type = zipfile.ZIP_DEFLATED
            zip_file.writestr(data, pdf)
    file_obj.seek(0)
    return send_file(file_obj, attachment_filename="forms.zip", as_attachment=True)

它正在返回一个 zip 文件,但 zip 文件中是 pdf 文件。此外,如果我删除 pdf 生成部分,zip 文件返回就好了。这是我的 Dockerfile:

FROM madnight/docker-alpine-wkhtmltopdf as wkhtmltopdf_image
FROM python:3.9-alpine

RUN adduser -D custom

WORKDIR /home/Project

COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install --upgrade pip
RUN apk add make automake gcc g++ subversion python3-dev jpeg-dev zlib-dev libffi-dev musl-dev openssl-dev freetype freetype-dev ttf-freefont libxrender qt5-qtbase-dev
RUN venv/bin/pip install -r requirements.txt
RUN venv/bin/pip install gunicorn

COPY Project Project
COPY boot.sh app.py .env run.py create_database.py config.py ./
COPY templates templates
COPY static static
COPY --from=wkhtmltopdf_image /bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf
RUN chmod +x boot.sh

ENV FLASK_APP app.py

USER root
RUN chown -R custom ./
USER custom

EXPOSE 9001
ENTRYPOINT ["./boot.sh"]

我应该说,这是许多尝试使它起作用的最后一次迭代。本质上,我试过通过 curl 获取 wkhtmltox,我试过将 wkhtmltopdf 放在不同的目录中。到目前为止,没有任何效果。我不知道我错过了什么。这基本上是我为了完成这个项目需要解决的问题,所以任何帮助都将不胜感激。

编辑:docker-compose.yml

version: '2'
services:
  app:
    build: .
    networks:
      - custom
    ports:
      - "9001:9001"
    volumes:
      - "./static:/home/EventismedEquipmentAPI/static"
    external_links:
      - eventismed-equipment:db
networks:
  custom:
    external: true

最佳答案

让我们解决这个问题。

我已经设法在 docker 容器上隔离运行 wkhtmltopdf

docker 文件:

# https://stackoverflow.com/a/62737156/152016
# Create image based on the official openjdk 8-jre-alpine image from the dockerhub
FROM openjdk:8-jre-alpine

# Install wkhtmltopdf
# https://stackoverflow.com/a/56925361/152016
RUN apk add --no-cache wkhtmltopdf ttf-dejavu

ENTRYPOINT ["sh"]

docker-compose.yml:

version: '3.8'

services:
  wkhtmltopdf:
    image: wkhtmltopdf
    container_name: wkhtmltopdf
    build:
      dockerfile: Dockerfile
      context: .

然后:

docker-compose build
docker run -ti --rm -v /tmp:/tmp wkhtmltopdf

容器内部:

$ cd /tmp
$ wkhtmltopdf https://www.google.com test.pdf

然后你会在你的 mac 上看到 pdf 文件在 /tmp/test.pdf

首先让我知道这是否有效。

关于docker - 库 wkhtmltopdf 在 Docker 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67283831/

相关文章:

docker - 无法在Docker和Rancher上运行启动脚本

python - 在 Flask 中运行后台 Celery 任务

java - 如何在 Java Web 应用程序中使用 wkhtmltopdf?

ruby-on-rails-3 - wicked_pdf 和 wkhtmltopdf 页面大小问题

css - wkhtmltopdf 或 css 大小(A4、mm、in)的问题

java - Docker-compose:/app.war 中没有主要 list 属性

java - 安装多个后端镜像时出现 docker 错误

python - 为什么我必须为 SQLAlchemy 更改 Flask 中的 uri?

python - 返回 send_file 的端点不再被调用

java - Mill Build Tool - 在不编译源代码的情况下安装依赖项