pdftk
一位同事最近告诉我他最喜欢的实用工具之一PDFtk 。 除其他事项外,它使您可以合并,拆分和合并具有或不具有加密功能的PDF文档。 您可以在此Opensource.com文章中了解有关它的更多信息。
不幸的是,由于构建要求,PDFtk上次打包在Fedora 20中。 尽管有各种替代方法可用,但您可能仍想使用PDFtk。 幸运的是,有一个简单的解决方案:只需将其包装在容器中,然后在更新的Fedora版本上运行即可。
我没有进行彻底的研究,而是进行了一些快速的研究,发现了一个带有README和Dockerfile的GitHub存储库来构建这样的容器。
首先,通过安装,启用和启动Docker服务,确保已配置Docker环境:
$ sudo dnf install -y docker
$ sudo systemctl enable docker
$ sudo systemctl start docker
$ sudo systemctl status docker
README文件显示了如何定义别名来运行容器:
# alias pdftk='docker run -it --privileged -v $PWD:/workdir -w /workdir/ /pdftk'
请注意,-- --privileged
选项以根用户--privileged
运行容器。 尽管这将允许容器访问我们正在使用的文件(使用-v
选项),但也会导致新文件归root拥有。 但是,以根用户身份运行容器不是最佳的安全实践。 在开始之前,请按如下所示修改Docker构建配置:
$ cat Dockerfile
# Container build for pdftk (last packaged in Fedora 20)
FROM fedora:20
MAINTAINER crempel@redhat.com
# Update and install pdftk
RUN yum update -y && \
yum install -y pdftk && \
yum clean all
# Working directory
WORKDIR /workdir
# Set pdftk as our entry point
ENTRYPOINT ["/usr/bin/pdftk"]
CMD ["--help"]
首先从拉下Fedora 20官方图像开始。 如果需要,可以将MAINTAINER
电子邮件地址更改为您自己的电子邮件地址。 接下来,它将更新所有软件包,安装PDFtk,并删除缓存的文件。 将这三个单独的命令放在单个RUN
命令上,只会在容器中创建一个附加层,而不是三个。
WORKDIR
关键字定义将在其中创建新文件的临时工作目录。
最后,它将PDFtk二进制文件设置为容器的入口点,如果没有参数传递给容器,则CMD
提供--help
选项。
您现在可以使用修改后的Dockerfile构建容器,如下所示:
$ sudo docker build -t fedora/pdftk .
并检查新图像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora/pdftk latest f2eaa35d31c8 3 seconds ago 595 MB
docker.io/fedora 20 ba74bddb630e 20 months ago 291 MB
要以与独立二进制文件相同的方式运行PDFtk容器,请使用以下包装器脚本:
$ cat ~/bin/pdftk
#!/bin/bash
# Run the pdftk container and pass all arguments to this script to the container:
#
# --rm remove instantiated container after execution
# -u run with current UID/GID to give new files correct ownership
# -v attach current working directory to /workdir inside the container
# and modify SELinux security context ("z") to allow container access to files
sudo docker run \
--rm \
-u $(id -u):$(id -g) \
-v $PWD:/workdir:z \
fedora/pdftk "$@"
# Files will now have SELinux type container_file_t so we need to restore context:
restorecon $PWD/*.pdf
exit
该脚本不使用--privileged
选项以根用户身份运行容器,而是传递您的唯一标识符(UID)和组标识符(GID),从而使新文件具有正确的所有者和组。 您当前的工作目录映射到容器内的/workdir
,并且在内部目录后附加:z
可以更改SELinux上下文,以便容器可以访问您的当前工作目录。 当然,这假定您已启用SELinux。 如果禁用SELinux, 将使Dan Walsh伤心 ; 丹是个好人,请不要这样做。
容器终止后,将SELinux上下文从container_file_t
恢复到user_home_t
(假设您位于主文件夹结构中)。 虽然您仍然可以使用新的上下文访问文件,但是使用restorecon可以使事情整洁。
建立容器并安装包装脚本后,您现在可以像以前一样运行PDFtk。
例如:
$ pdftk A=pdf1.pdf B=pdf2.pdf cat A B output pdf12.pdf
使较旧的应用程序恢复活力是容器的一个很好的用例。 使用容器还解决了哪些其他问题? 在下面的评论部分让我知道。
pdftk