最近公司的应用都在准备容器化,因为测试发布几十个应用太麻烦,而且由于环境因素部署可能会出现各种问题.为了在开发、测试和生产中保持一致的环境,引入了容器技术。我们首先通过边际项目试水,积累经验。今天,我们简单总结了几种常见的SpringBootDocker打包工具。SpringBootDocker在SpringBoot应用中,我们可以约定不同的身份来定义不同的环境。例如dev表示开发环境,test表示测试环境,对应的配置文件为application-dev.yaml和application-test.yaml。我们通过声明spring.profiles.active来激活相应的环境配置,例如在激活dev环境时,spring.profiles.active=dev。完整的启动命令为:java-Djava.security.egd=file:/dev/./urandom-Dspring.profiles.active=dev-jarspring-boot-app.jar根据上面的命令:#引入openjdk镜像FROMadoptopenjdk/openjdk8#声明作者LABELAUTHOR=felordOG=felord.cn#挂载logs等几个有用的文件夹VOLUME["/tmp","/logs"]#声明动态激活的环境参数配置文件默认devENVACTIVE=dev#暴露端口EXPOSE8080#应用打包后复制并修改jar文件名ADD/target/flyway-spring-boot-1.0.0.jarapp.jar#容器运行时的第一个命令启动启动应用程序ENTRYPOINT["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"]这样打包后的Docker镜像可以通过dockerrun添加额外的--envACTIVE=test来动态改变环境。单纯写Dockerfile对于我们的DevOps来说并不方便。在docker镜像生命周期中,我们需要能够自动构建、推送到仓库、拉取镜像、运行一系列流水线操作。幸运的是,市场上有很多工具可以帮助我们实现这个过程。spring-boot-maven-plugin是SpringBoot官方插件,在2.x的某个版本中提供了Docker镜像构建能力。<项目>org.springframework.bootspring-boot-maven-plugindocker.repo.com/library/${project.artifactId}:${project.version}true<用户名>用户用户名><密码>秘密密码>https://docker.repo.com/v1/user@example.com配置Docker私有仓库后,可以通过mvncleanspring-boot:build-image构建镜像。这种方法的优点是没有额外的依赖。缺点是需要从github上下载搭建组件。如果网络不好,很容易失败。SpotifyMavenPluginSpotifyMavenPlugin是目前比较流行的选择。它需要应用开发者编写Dockerfile,并将Dockerfile放在项目的src/main/docker目录下。然后就可以导入:com.spotifydockerfile-maven-plugin1.4.8repo.com/${project.artifactId}这个插件提供了mvndockerfile:build、mvndockerfile:tag、mvndockerfile:push三个命令来构建、标记和发布非常简单去远程私有仓库。这是一个非常易于使用的插件。唯一的要求是能够编写Dockerfile。定制化要求高的可以用这个。JibMavenPlugin我在之前的文章中介绍过,大家可以多了解一下。是Google开源的OCI镜像打包工具,可以用来打包Docker镜像,可以满足大多数情况下的需求。但是如果你想定制它并不容易,你需要阅读官方文档。最开始的Dockerfile如果使用JIb的话需要这样配置:com.google.cloud.toolsjib-maven-plugin3.0.0<配置>adoptopenjdk/openjdk8docker.repo.com/library/${project.artifactId}felordxxxxxx${project.version}target/${project.artifactId}-${project.version}.jar*.jar/app.jar打包/tmp,/logs8080devjava,-Djava.security.egd=file:/dev/./urandom,-Dspring.profiles.active=${active},-jar,/app.jarUSE_CURRENT_TIMESTAMP优点是不需要本地Docker环境,支持分层构建,image瘦身,上手容易;缺点是定制难转载本文请联系码农小胖公众号。