Skip to content

快速参考

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

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

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

快速参考(续)

什么是 Clojure?

Clojure 是 Lisp 编程语言的一种方言。它是一种通用编程语言,强调函数式编程。它可以在 Java 虚拟机、公共语言运行时和 JavaScript 引擎上运行。像其他 Lisp 语言一样,Clojure 将代码视为数据,并具有宏系统。

wikipedia.org/wiki/Clojure (该内容为网址,在中文语境中一般不进行翻译)

logo

如何使用此图像

构建工具

Clojure 有三种构建和运行项目的主要方法:

  1. 莱宁根
    1. 最古老且或许是最常见的工具
  2. 启动;引导;开机(根据具体语境,“boot”有多种含义,这里给出一些常见的译法)
    1. 一种解决与 Leiningen 类似问题的替代方法
  3. 工具依赖项
    1. 对于某些 lein/boot 用例的一个更新的官方工具

对于这三种工具及其各自的版本,此图像存在多种变体。这些标记的最基本形式为:

  1. clojure:lein
  2. clojure:boot
  3. clojure:tools-deps

但您也可以添加一个连字符以及您想要使用的该工具的版本。例如,对于 lein 2.8.1,您可以使用此图像: clojure:lein-2.8.1

使用 Leiningen 运行您的应用程序

将以下内容添加到现有的 Leiningen/Clojure 项目中,添加一个 Dockerfile

FROM clojure
COPY . /usr/src/app
WORKDIR /usr/src/app
CMD ["lein", "run"]

然后,运行这些命令来构建并运行映像:

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

虽然上述是 Dockerfile 最直接的示例,但它确实存在一些缺陷。 lein run 命令将下载您的依赖项、编译项目,然后运行它。这是大量的工作,您可能并不希望每次运行映像时都执行所有这些操作。为了解决这个问题,您可以提前下载依赖项并编译项目。这样在运行您的映像时,将显著减少启动时间。

FROM clojure
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY project.clj /usr/src/app/
RUN lein deps
COPY . /usr/src/app
RUN mv "$(lein uberjar | sed -n 's/^Created \(.*standalone\.jar\)/\1/p')" app-standalone.jar
CMD ["java", "-jar", "app-standalone.jar"]

以这种方式编写 Dockerfile 将下载依赖项(并对其进行缓存,因此只有在依赖项发生变化时才会重新下载),然后提前将它们编译为一个独立的 jar 文件,而不是在每次运行映像时进行编译。

然后您可以像上面那样构建并运行该映像。

在容器内将您的 Lein/Clojure 项目编译成一个 jar 文件

如果您有一个现有的 Lein/Clojure 项目,那么从容器中将您的项目编译成一个 jar 文件是相当简单的:

$ docker run -it --rm -v "$PWD":/usr/src/app -w /usr/src/app clojure lein uberjar

这会将您的项目构建为一个位于项目的 target/uberjar 目录中的 jar 文件。

更多细节

有关将此映像与引导程序和 tools-deps 配合使用的更多详细信息,请参阅官方映像 README。

图像变体

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

clojure:<version>

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

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

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

clojure:<version>-alpine

此图像基于流行的 Alpine Linux 项目,可在 alpine 官方镜像中获取。Alpine Linux 比大多数发行版基础镜像(约 5MB)小得多,因此总体上会生成更精简的镜像。

当您首要关注的是最终图像大小尽可能小的时候,此变体是有用的。需要注意的主要警告是,它确实使用 musl libc 而不是 glibc 及相关库,因此软件往往会根据其对 libc 要求/假设的深度而遇到问题。有关可能出现的问题以及使用基于 Alpine 的图像的一些利弊比较的更多讨论,请参阅此 Hacker News 评论线程。

为尽量减小镜像大小,在基于 Alpine 的镜像中通常不会包含其他相关工具(例如 gitbash )。以该镜像为基础,在您自己的 Dockerfile 中添加您需要的内容(如果您不熟悉如何安装软件包,请参阅 alpine 镜像说明中的示例)。

clojure:<version>-slim

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

许可证

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

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

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

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