一位同事最近告诉我他最喜欢的实用程序之一: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
使旧应用程序重获新生是容器的一个很好的用例。 您还使用容器解决了哪些其他问题? 请在下面的评论区告诉我。
1 条评论