Skip to content

快速参考

  • 由……维护: (注:原文中“Maintained by:”后面应该会有具体的维护者信息,若有完整内容,翻译会更加准确。这里仅根据给定的部分进行了翻译。)
    Perl 社区

  • 哪里可以获得帮助:
    Docker 社区 Slack、Server Fault、Unix & Linux 或 Stack Overflow

支持的标签及各自的 Dockerfile 链接

快速参考(续)

什么是 Perl?

Perl 是一种高级、通用、解释型、动态的编程语言。Perl 语言从其他编程语言中借鉴了一些特性,包括 C、shell 脚本(sh)、AWK 和 sed。

wikipedia.org/wiki/Perl (该文本为网址,在中文语境中一般直接保留原文)

logo

如何使用此图像

在您的 Perl 应用项目中创建一个 Dockerfile

FROM perl:5.34
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "perl", "./your-daemon-or-script.pl" ]

然后,构建并运行 Docker 镜像:

$ docker build -t my-perl-app .
$ docker run -it --rm --name my-running-app my-perl-app

运行一个单一的 Perl 脚本

对于许多简单的单文件项目,您可能会发现编写完整的 Dockerfile 不太方便。在这种情况下,您可以直接使用 Perl Docker 镜像来运行 Perl 脚本:

$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp perl:5.34 perl your-daemon-or-script.pl

抱歉,原文“Coexisting with Debian's /usr/bin/perl ”似乎不太符合常规的语言表达,难以进行准确的翻译。如果您有更多的上下文或确认原文的准确性,我将尽力为您提供更准确的翻译

为该映像构建的 perl 二进制文件安装在 /usr/local/bin/perl 中,同时在 Perl 发行版中的其他标准工具,如 proveperldoc ,以及用于安装 CPAN 模块的 cpanm 也安装在其中。运行此映像的容器还将其 PATH 环境设置为像 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 一样,以确保在正常使用中首先找到此 perl 二进制文件。

由于此 Docker 官方镜像使用 buildpack - deps 镜像(或针对 :slim 变体的 debian:slim)构建,因此该镜像还包含由 Debian 项目提供的 /usr/bin/perl 。这是底层 dpkg/apt 包管理工具能够正常工作所必需的,因为由于不同的配置(例如 @INC 和安装路径,以及其他差异,如是否包含 -Dusethreads 等),此处不能使用 docker - perl。

另请参阅 Perl/docker-perl#26 以获取更深入的讨论。

信号处理行为通知

在容器中,Perl 默认会以 PID 1 运行(除非设置了 ENTRYPOINT),因此当期望向其发送信号(特别是 SIGINT 或 SIGTERM)时,需要特别注意。例如,运行

$ docker run -it --name sleeping_beauty --rm perl:5.34 perl -E 'sleep 300'

并且在另一个终端上进行操作,

$ docker exec sleeping_beauty kill 1

不会停止在 sleeping_beauty 容器上运行的 perl(它会一直运行,直到 sleep 300 完成。)要做到这一点,必须像这样设置一个信号处理程序:

$ docker run -it --name quick_nap --rm perl:5.34 perl -E '$SIG{TERM} = sub { $sig++; say "recv TERM" }; sleep 300; say "waking up" if $sig'

这样做 docker exec quick_nap kill 1 (或更简单的 docker stop quick_nap )将立即停止容器,并在另一个终端中打印 recv TERM 。请注意,信号处理程序本身不会停止 perl 进程,除非它调用 dieexit ;在这种情况下,perl 将在收到信号后继续并打印 waking up

如果您的 Perl 程序需要处理信号并派生子进程,建议使用类似 init 的程序作为 ENTRYPOINT,例如 dumb-init 或 tini(自 Docker 1.13 起,可通过 docker run --init 标志使用后者)。

另请参阅 perlipc 中的信号以及 Perl/docker-perl#44 。

在基于 Debian Bookworm 的映像(Perl >= 5.38)中的 COPYWORKDIR 行为

由于我们的 Perl 图像基于标准的 buildpack-depsdebian 图像,这些图像继承了在 Debian 12(Bookworm)中引入的新合并-usr 根文件系统布局,这可能会影响某些构建上下文,其中 COPY 将其自己的 binsbinlib 目录放入 WORKDIR / 中。鼓励用户尽可能将 WORKDIR 明确设置为除 / 之外的路径,例如示例中此处显示的 /usr/src/app ,尽管在当前版本中,我们的图像现在默认为 WORKDIR /usr/src/app

另请参阅 Perl/docker-perl#140 以获取更多信息。

示例:为 Perl 项目创建可重复使用的纸箱图像

假设您有一个使用 Carton 来管理 Perl 依赖项的项目。您可以创建一个 perl:carton 镜像,该镜像在其 Dockerfile 中使用 ONBUILD 指令,如下所示:

FROM perl:5.34

RUN cpanm Carton \
    && mkdir -p /usr/src/app
WORKDIR /usr/src/app

ONBUILD COPY cpanfile* /usr/src/app
ONBUILD RUN carton install

ONBUILD COPY . /usr/src/app

然后,在您的 Carton 项目中,您现在可以将项目的 Dockerfile 缩减为一行 FROM perl:carton ,这可能足以构建一个独立的映像。

拥有一个单一的 perl:carton 基础镜像很有用,特别是如果您有多个基于 Carton 的项目正在开发中,这样可以避免安装 Carton 的“样板”编码和/或将项目源文件复制到派生镜像中。但是,请记住,以这种方式使用 Perl 镜像时需要考虑某些事项:

  • 这种基础镜像会将有用的位(例如上述的 COPY / RUN )隐藏在镜像中,使用该基础镜像将其与更具体的 Dockerfile 分开。这在创建进一步的派生镜像时可能会导致混淆,因此要了解 ONBUILD 触发器的工作方式并进行适当的规划。
  • 存在维护额外基础镜像构建的成本,因此,如果您正在处理单个 Carton 项目和/或计划发布它,那么直接从版本化的 perl 镜像派生可能更可取。

图像变体

perl 图像有多种类型,每种都针对特定的用例而设计。

perl:<version>

这是事实上的映像。如果您不确定自己的需求是什么,您可能想要使用这个。它被设计为既可以用作一次性容器(挂载您的源代码并启动容器以启动您的应用程序),也可以作为构建其他映像的基础。

其中一些标签的名称可能包含诸如“书虫”或“靶心”之类的名称。这些是 Debian 发行版的套件代号,表明该映像基于哪个发行版。如果您的映像需要安装除映像自带的软件包之外的任何其他软件包,您可能需要明确指定其中之一,以在 Debian 有新发行版时最大程度地减少损坏。

此标签基于 buildpack-depsbuildpack-deps 是为在其系统上有许多镜像的 Docker 普通用户设计的。按设计,它具有大量极为常见的 Debian 软件包。这减少了从其派生的镜像需要安装的软件包数量,从而减小了系统上所有镜像的总体大小。

perl:<version>-slim

此图像不包含默认标签中包含的常见软件包,仅包含运行 perl 所需的最小软件包。除非您在仅会部署 perl 图像且存在空间限制的环境中工作,否则我们强烈建议使用此存储库的默认图像。

许可证

查看此映像中所包含软件的许可证信息。

与所有 Docker 镜像一样,这些镜像可能还包含其他可能受其他许可证约束的软件(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。

一些能够自动检测到的额外许可信息可能会在 repo-info 存储库的 perl/ 目录中找到。

对于任何预构建图像的使用,图像用户有责任确保对此图像的任何使用都符合其中包含的所有软件的任何相关许可。