You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laradock环境Ubuntu20.04安装PDFtk及跨容器调用问题咨询

解决方案

最优方案:无需额外容器,直接安装兼容版pdftk

Ubuntu 20.04官方源已经提供了pdftk的Java实现版本pdftk-java,命令行参数和原版pdftk100%兼容,不需要单独部署pdftk容器,直接在php-fpm和workspace中安装即可:
编辑Laradock对应服务的Dockerfile:

  • php-fpm/Dockerfile(对应FPM服务)
  • workspace/Dockerfile(对应命令行服务)

在apt安装段添加以下内容:

RUN apt-get update && \
    apt-get install -y pdftk-java && \
    rm -rf /var/lib/apt/lists/*

重新构建对应容器后,直接在代码里调用pdftk命令即可,完全兼容原有逻辑,改动成本最低。


备选方案:单独部署pdftk容器的调用方法

如果确实需要单独维护pdftk容器,按以下步骤调整配置和调用:

1. 修正现有配置错误

调整Dockerfile

原有配置的ENTRYPOINT和CMD冲突,无法常驻后台执行命令,调整为:

# pdftk/Dockerfile
FROM ubuntu:16.04

USER root

ARG TOP_LEVEL_DIR="pdftk"

RUN apt-get update && \
    apt-get -y install pdftk && \
    mkdir -p /${TOP_LEVEL_DIR} && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /pdftk
# 让容器常驻后台
CMD ["sleep", "infinity"]

调整docker-compose.yml

注意配置文件正确名称为docker-compose.yml,调整内容如下:

### pdftk ###############################################
pdftk:
  image: pdftk
  container_name: pdftk
  build:
    context: ./pdftk
  volumes:
    # 和php-fpm、workspace挂载相同的项目目录,保证路径映射一致
    - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}
    # 仅当使用docker exec调用时需要挂载docker.sock
    - /var/run/docker.sock:/var/run/docker.sock
  restart: unless-stopped
  networks:
    - backend

2. 两种调用方式

方式1:Docker exec调用(改动最小)

需要先在php-fpm和workspace容器中安装docker客户端:
编辑对应服务的Dockerfile,添加docker客户端安装逻辑:

RUN apt-get update && \
    apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
    apt-get update && \
    apt-get install -y docker-ce-cli && \
    usermod -aG docker www-data # workspace环境将www-data改为laradock && \
    rm -rf /var/lib/apt/lists/*

代码中原有的pdftk调用改为调用容器内命令即可,因为三个容器的项目路径完全一致,不需要转换路径:

// 原调用:exec('pdftk input.pdf output out.pdf');
// 改后调用:
exec('docker exec pdftk pdftk ' . realpath('input.pdf') . ' output ' . realpath('out.pdf'));

方式2:HTTP接口封装(更安全)

如果不想挂载docker.sock规避权限风险,可以在pdftk容器内部署一个简单的HTTP服务,接收文件和参数返回处理后的PDF,业务代码通过HTTP请求调用即可,适合多机器分布式部署场景。

内容的提问来源于stack exchange,提问作者alvaro.canepa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:36:05