Maven 是目前最流行的 Java 项目管理工具之一,提供了强大的包依赖管理和应用构建功能。
Docker 提供了可以用于管理和构建 Java 应用。与直接安装使用 Maven 工具相比,使用 Docker 镜像具有更好的可移植性,可以方便地进行版本切换,非常适合在持续集成过程中使用。
关于 Maven 官方镜像的用法可以参考
Maven 官方仓库在国内网络下的下载速度实在是让人欲哭无泪,利用阿里云的 Maven 镜像可以大大提升软件包下载速度。
我们可以在官方 Maven 镜像的基础之上添加阿里云镜像配置。其代码可以在 上获得
它的配置文件
如下
- settings.xml
- <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
- https://maven.apache.org/xsd/settings-1.0.0.xsd">
- <localRepository>
- /usr/share/maven/ref/repository
- </localRepository>
- <mirrors>
- <mirror>
- <!--This sends everything else to /public -->
- <id>
- aliyun-nexus
- </id>
- <mirrorOf>
- *
- </mirrorOf>
- <url>
- http://maven.aliyun.com/nexus/content/groups/public/
- </url>
- </mirror>
- <mirror>
- <!--This is used to direct the public snapshots repo in the profile below
- over to a different nexus group -->
- <id>
- aliyun-nexus-public-snapshots
- </id>
- <mirrorOf>
- public-snapshots
- </mirrorOf>
- <url>
- http://maven.aliyun.com/nexus/content/repositories/snapshots/
- </url>
- </mirror>
- </mirrors>
- </settings>
阿里云容器服务提供了预构建的 Docker 镜像可供直接使用
,
- registry.cn-hangzhou.aliyuncs.com/acs/maven
我们可以像使用
命令一样,直接在当前目录中执行如下命令来构建应用
- mvn
- docker run - it--rm--name maven - v "$(pwd)": /usr/src / app - w / usr / src / app registry.cn - hangzhou.aliyuncs.com / acs / maven mvn clean install
如果希望能够缓存下载的 maven 仓库,我们可以利用 Docker 的文件卷来实现
首先执行如下命令创建一个名为 "maven-repo" 的文件卷
- docker volume create--name maven - repo
在之后的调用中,将其挂载到 maven 镜像中仓库下载目录上
- docker run - it--rm--name maven - v "$(pwd)": /usr/src / app - v maven - repo: /usr/share / maven / ref - w / usr / src / app registry.cn - hangzhou.aliyuncs.com / acs / maven mvn clean install
这样 maven 仓库就不会每次都下载一遍了。
我们可以在 Dockerfile 中构建应用,并利用 Docker 构建时的分层缓存机制来提升构建速度
下面是一个示例
文件
- Dockerfile.build
- FROM registry.cn - hangzhou.aliyuncs.com / acs / maven: 3 - jdk - 8 ENV MY_HOME = /usr/src / app RUN mkdir - p $MY_HOME WORKDIR $MY_HOME ADD pom.xml $MY_HOME#get all the downloads out of the way RUN["/usr/local/bin/mvn-entrypoint.sh", "mvn", "verify", "clean", "--fail-never"]#add source ADD.$MY_HOME#run maven verify RUN["/usr/local/bin/mvn-entrypoint.sh", "mvn", "verify"]
其中的一个重要技巧就是先把
添加到工作目录,利用 maven 命令下载应用所需 jar 包之后,再添加应用源文件进行编译。这样只要 pom.xml 没有更新就不会重新下载所依赖的 jar 包,可以大大加快镜像构建速度。
- pom.xml
我们可以通过如下命令来编译应用
- docker build - t builder - img - f Dockerfile.build.
对于静态编译型语言,我们通常需要将应用编译过程与镜像构建过程分离。主要有以下两个考虑:
我们可以将应用编译结果从 Docker 镜像中拷贝出来,方法如下
- docker build - t builder - img - f Dockerfile.build.docker create--name builder builder - img docker cp builder: /usr/src / app / target. / target
这时 maven 构建的结果就被拷贝到当前目录的 "target" 子目录下面了。
之后,我们可以利用另外一个 Dockerfile 来构建应用镜像了。篇幅有限不再赘述。
本文以 Maven 为例介绍了 Docker 在应用构建中的一些常见技巧
想了解更多容器服务内容,请访问
来源: https://yq.aliyun.com/articles/65274