库 wkhtmltopdf 在 Docker 中不工作
Library wkhtmltopdf is not working inside Docker
我在 Python Flask 中有一个代码,我在其中使用 HTML 模板生成 pdf 文件。当我单独 运行 时代码工作得很好,但是当我尝试 运行 它在 Docker 容器中时,只要我调用生成报告的端点 docker 崩溃并重置。它只是保持加载状态,然后 returns 出现错误(在我用来测试的 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 文件 returns 就好了。这是我的 Docker 文件:
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
让我们解决这个问题。
我已经设法 运行 wkhtmltopdf
隔离在 docker 容器上。
Docker 文件:
#
# Create image based on the official openjdk 8-jre-alpine image from the dockerhub
FROM openjdk:8-jre-alpine
# Install wkhtmltopdf
#
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 /tmp/test.pdf
上看到 pdf
首先让我知道这是否有效。
我在 Python Flask 中有一个代码,我在其中使用 HTML 模板生成 pdf 文件。当我单独 运行 时代码工作得很好,但是当我尝试 运行 它在 Docker 容器中时,只要我调用生成报告的端点 docker 崩溃并重置。它只是保持加载状态,然后 returns 出现错误(在我用来测试的 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 文件 returns 就好了。这是我的 Docker 文件:
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
让我们解决这个问题。
我已经设法 运行 wkhtmltopdf
隔离在 docker 容器上。
Docker 文件:
#
# Create image based on the official openjdk 8-jre-alpine image from the dockerhub
FROM openjdk:8-jre-alpine
# Install wkhtmltopdf
#
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 /tmp/test.pdf
首先让我知道这是否有效。