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
相关产品推荐
相关产品推荐

