Skip to content

快速参考

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

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

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

快速参考(续)

什么是 Maven?

Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven 可以从一个核心信息源管理项目的构建、报告和文档。

logo

如何使用此图像

您可以直接使用 Maven Docker 镜像运行 Maven 项目,向 docker run 传递一个 Maven 命令:

$ docker run -it --rm --name my-maven-project -v "$(pwd)":/usr/src/mymaven -w /usr/src/mymaven maven:3.3-jdk-8 mvn clean install

构建本地 Docker 镜像(可选)

这是一个您可以扩展的基础镜像,因此它具有所需的最基本软件包。如果您将自定义软件包添加到 Dockerfile 中,那么您可以像这样构建您的本地 Docker 镜像:

$ docker build --tag my_local_maven:3.5.2-jdk-8 .

复用 Maven 本地仓库

通过创建一个卷并在 /root/.m2 中挂载它,本地 Maven 仓库可以在多个容器中重复使用。

$ docker volume create --name maven-repo
$ docker run -it -v maven-repo:/root/.m2 maven mvn archetype:generate # will download artifacts
$ docker run -it -v maven-repo:/root/.m2 maven mvn archetype:generate # will reuse downloaded artifacts

或者您可以仅使用您的家庭.m2 缓存目录,例如您与您的 Eclipse/IDEA 共享的那个:

$ docker run -it --rm -v "$PWD":/usr/src/mymaven -v "$HOME/.m2":/root/.m2 -v "$PWD/target:/usr/src/mymaven/target" -w /usr/src/mymaven maven mvn clean package

使用映像打包本地存储库

$MAVEN_CONFIG 目录(默认为 /root/.m2 )可配置为卷,因此在构建时在 Dockerfile 中复制到该目录的任何内容都会丢失。因此存在 /usr/share/maven/ref/ 目录,该目录中的任何内容都会在容器启动时复制到 $MAVEN_CONFIG

要创建一个预打包的存储库,创建一个具有您所需依赖项的 pom.xml ,并在您的 Dockerfile 中使用此依赖项。 /usr/share/maven/ref/settings-docker.xml 是一个将本地存储库更改为 /usr/share/maven/ref/repository 的设置文件,但您可以使用自己的设置文件,只要它将 /usr/share/maven/ref/repository 用作本地存储库。

COPY pom.xml /tmp/pom.xml
RUN mvn -B -f /tmp/pom.xml -s /usr/share/maven/ref/settings-docker.xml dependency:resolve

要将您的自定义 settings.xml 文件添加到图像中使用

COPY settings.xml /usr/share/maven/ref/

例如,查看 tests 目录

以非 root 身份运行

Maven 需要用户主目录来下载构件,如果映像中不存在该用户,则需要设置一个额外的 user.home Java 属性。

例如,以用户 1000 运行,挂载主机的 Maven 存储库

$ docker run -v ~/.m2:/var/maven/.m2 -ti --rm -u 1000 -e MAVEN_CONFIG=/var/maven/.m2 maven mvn -Duser.home=/var/maven archetype:generate

图像变体

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

maven:<version>

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

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

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

maven:<version>-alpine

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

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

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

许可证

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

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

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

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