使 PDFtk 在容器中重获新生

这款 PDF 合并和拆分工具已有一段时间未在 Fedora 中打包,但这并不意味着您无法使用它。
221 位读者喜欢这个。
A guide to packing and preparing for a tech conference

Opensource.com

一位同事最近告诉我他最喜欢的实用程序之一:PDFtk。 除此之外,它还可以让您合并、拆分和分解 PDF 文档,无论是否加密。 您可以在这篇 Opensource.com 文章 中了解更多相关信息。

不幸的是,由于构建要求,PDFtk 上次在 Fedora 20 中打包。 虽然有各种 替代方案 可用,但您可能仍然想使用 PDFtk。 幸运的是,有一个简单的解决方案:只需将其打包到容器中,并在较新的 Fedora 版本上运行即可。

与其重新发明轮子,我做了一些快速研究,找到了一个 GitHub 存储库,其中包含一个 README 和一个 Dockerfile,用于构建这样的容器。

首先,通过安装、启用和启动 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 选项以 root 用户身份运行容器。 虽然这会允许容器访问我们正在处理的文件(使用 -v 选项),但也会导致新文件归 root 用户所有。 但是以 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 选项以 root 用户身份运行容器,而是传递您的唯一标识符 (UID) 和组标识符 (GID),从而允许新文件具有正确的所有者和组。 您当前的工作目录映射到容器内的 /workdir,并且将 :z 附加到内部目录允许更改 SELinux 上下文,以便容器可以访问您当前的工作目录。 当然,这假设您已启用 SELinux。 如果您禁用 SELinux,您将 让 Dan Walsh 伤心; Dan 是个好人,所以请不要这样做。

容器终止后,SELinux 上下文将从 container_file_t 恢复到 user_home_t(假设您在您的主文件夹结构中)。 虽然您仍然可以使用新上下文访问文件,但使用 restorecon 将使事情井然有序。

构建容器并安装包装器脚本后,您现在可以像以前一样运行 PDFtk。

例如

$ pdftk A=pdf1.pdf B=pdf2.pdf cat A B output pdf12.pdf

使旧应用程序重获新生是容器的一个很好的用例。 您还使用容器解决了哪些其他问题? 请在下面的评论区告诉我。

标签
User profile image.
Curtis Rempel,RHCA,是 Red Hat 认证团队的系统设计工程师。 他的 Linux 之旅始于 1994 年 Jon “maddog” Hall 赠送的 Red Hat Linux 2.1 CD。

1 条评论

xpdf 和 poppler-utils 是您的朋友。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.