使用jib打包docker镜像实战
序
本文主要研究一下如何使用google的jib打包docker镜像
Jib是谷歌最新开源的Java应用的Docker镜像生成工具,可以通过Gradle或Maven直接生成镜像并上传到仓库而不需要Dockerfile文件或者其他插件;Jib支持将资源文件和类分层打包,可以大幅度提升生成镜像的速度
有一些其他的插件也可以通过Docker实现生成镜像,如com.palantir.docker等,但是都需要额外配置Dockerfile,如果应用仅需要通过Dockerfile构建镜像,建议使用Jib来提升构建和上传速度
maven
com.google.cloud.tools jib-maven-plugin 0.9.9
配置
UTF-8 UTF-8 1.8 yyyyMMdd org.springframework.boot spring-boot-maven-plugin com.google.cloud.tools jib-maven-plugin 0.9.9 -Xms512m 8080 true java:8u172-jre-alpine jib-demo:${maven.build.timestamp} true ${project.basedir}/src/main/jib
这里指定baseimage为java:8u172-jre-alpine
同时指定生成的image名称为jib-demo:${maven.build.timestamp}
container标签可以指定相关参数,比如jvmFlags指定JVM参数,ports指定expose的端口号
extraDirectory用于指定要添加的目录,默认为${project.basedir}/src/main/jib,即该目录下的文件夹会在docker镜像里头同步创建,目录层级关系以jib下目录层级关系为准。比如该目录下有app/resources/demo.txt,则对应该镜像目录为/app/resources/demo.txt
打包
mvncompilejib:dockerBuild-X
使用jib:dockerBuild是在本地打包镜像,不push到远程,-X参数是显示debug信息
如果使用jib:build命令,则打包之后push到远程
输出日志实例:
[DEBUG]TIMINGBuildingimagetoDockerdaemon [DEBUG]RUNNINGBuildingimagetoDockerdaemon [INFO]Gettingbaseimagejava:8u172-jre-alpine... [DEBUG]TIMINGPullingbaseimagemanifest [DEBUG]RUNNINGPullingbaseimagemanifest [DEBUG]TIMINGBuildingapplicationlayers [DEBUG]RUNNINGBuildingapplicationlayers [INFO]Buildingdependencieslayer... [DEBUG]TIMINGBuildingdependencieslayer [DEBUG]RUNNINGBuildingdependencieslayer [INFO]Buildingresourceslayer... [DEBUG]TIMINGBuildingresourceslayer [DEBUG]RUNNINGBuildingresourceslayer [INFO]Buildingclasseslayer... [DEBUG]TIMINGBuildingclasseslayer [DEBUG]RUNNINGBuildingclasseslayer [INFO]Buildingextrafileslayer... [DEBUG]TIMINGBuildingextrafileslayer [DEBUG]RUNNINGBuildingextrafileslayer [DEBUG]TIMEDBuildingapplicationlayers:3.498ms [DEBUG]Buildingapplicationlayers:3.498ms [DEBUG]Buildingextrafileslayerbuiltsha256:0a9321c621ee2c138d9a93f4ba47f825e20dd7aca0e9206f30bf560122fdaa31 [DEBUG]Buildingresourceslayerbuiltsha256:933116c8da4db70000355b750af2f3b5c4545e74db7b5eb0a5e37689ef86d44f [DEBUG]Buildingclasseslayerbuiltsha256:a99dbde7d015ba3d15b9265ac38f6536d65b00dd2a864b7003a34742f483939b [DEBUG]TIMEDBuildingextrafileslayer:33.718ms [DEBUG]TIMEDBuildingclasseslayer:33.901ms [DEBUG]Buildingextrafileslayer:33.718ms [DEBUG]TIMEDBuildingresourceslayer:34.062ms [DEBUG]Buildingresourceslayer:34.062ms [DEBUG]Buildingclasseslayer:33.901ms [DEBUG]Buildingdependencieslayerbuiltsha256:a19961ec08095eb70ca3a070945223dcf51500a255a745272276139bf0a29f4e [DEBUG]TIMEDBuildingdependencieslayer:1047.83ms [DEBUG]Buildingdependencieslayer:1047.83ms [INFO]Thebaseimagerequiresauth.Tryingagainforjava:8u172-jre-alpine... //...... [DEBUG]TIMEDPullingbaseimagemanifest:8959.891ms [DEBUG]Pullingbaseimagemanifest:8959.891ms [DEBUG]TIMINGSettingupbaseimagecaching [DEBUG]RUNNINGSettingupbaseimagecaching [DEBUG]TIMEDSettingupbaseimagecaching:0.824ms [DEBUG]Settingupbaseimagecaching:0.824ms [DEBUG]TIMINGPullingbaseimagelayersha256:500c0ac4cdc58aee9a008e70466eeec8a4b74b25c29d003764635d2fe1b42827 [DEBUG]RUNNINGPullingbaseimagelayersha256:500c0ac4cdc58aee9a008e70466eeec8a4b74b25c29d003764635d2fe1b42827 [DEBUG]TIMINGPullingbaseimagelayersha256:aa38cd8c77d7320c7489327775e074580db5f23467198aab3e79c7db5cdfbdca [DEBUG]TIMINGPullingbaseimagelayersha256:cb56d62302ec31640b40ca15843e7af6be145966a1064c78ea7afd6f10ce49e6 [DEBUG]RUNNINGPullingbaseimagelayersha256:cb56d62302ec31640b40ca15843e7af6be145966a1064c78ea7afd6f10ce49e6 [DEBUG]TIMINGPullingbaseimagelayersha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28 [DEBUG]RUNNINGPullingbaseimagelayersha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28 [DEBUG]RUNNINGPullingbaseimagelayersha256:aa38cd8c77d7320c7489327775e074580db5f23467198aab3e79c7db5cdfbdca [DEBUG]TIMEDPullingbaseimagelayersha256:500c0ac4cdc58aee9a008e70466eeec8a4b74b25c29d003764635d2fe1b42827:612.524ms [DEBUG]Pullingbaseimagelayersha256:500c0ac4cdc58aee9a008e70466eeec8a4b74b25c29d003764635d2fe1b42827:612.524ms [DEBUG]TIMEDPullingbaseimagelayersha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28:9985.702ms [DEBUG]Pullingbaseimagelayersha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28:9985.702ms [DEBUG]TIMEDPullingbaseimagelayersha256:aa38cd8c77d7320c7489327775e074580db5f23467198aab3e79c7db5cdfbdca:27267.144ms [DEBUG]Pullingbaseimagelayersha256:aa38cd8c77d7320c7489327775e074580db5f23467198aab3e79c7db5cdfbdca:27267.144ms [DEBUG]TIMEDPullingbaseimagelayersha256:cb56d62302ec31640b40ca15843e7af6be145966a1064c78ea7afd6f10ce49e6:54734.971ms [DEBUG]Pullingbaseimagelayersha256:cb56d62302ec31640b40ca15843e7af6be145966a1064c78ea7afd6f10ce49e6:54734.971ms [DEBUG]TIMINGBuildingcontainerconfiguration [DEBUG]RUNNINGBuildingcontainerconfiguration [INFO]Finalizing... [DEBUG]TIMEDBuildingcontainerconfiguration:0.462ms [DEBUG]Buildingcontainerconfiguration:0.462ms [INFO]LoadingtoDockerdaemon... [DEBUG]TIMEDBuildingimagetoDockerdaemon:65862.956ms [DEBUG]BuildingimagetoDockerdaemon:65862.956ms [INFO] [INFO]Containerentrypointsetto[java,-Xms512m,-cp,/app/resources/:/app/classes/:/app/libs/*,com.example.JibDemoApplication] [INFO] [INFO]BuiltimagetoDockerdaemonasjib-demo:20180826 [INFO] [INFO]------------------------------------------------------------------------ [INFO]BUILDSUCCESS [INFO]------------------------------------------------------------------------ [INFO]Totaltime:01:07min [INFO]Finishedat:2018-08-26T21:38:11+08:00 [INFO]FinalMemory:26M/493M [INFO]------------------------------------------------------------------------
查看镜像
dockerinspectjib-demo:20180826 [ { "Id":"sha256:7554492dde84091bc6d015b29ec4bf854bb841b9ec4d8f7bef8b51a8ec59ef94", "RepoTags":[ "jib-demo:20180826" ], "RepoDigests":[], "Parent":"", "Comment":"", "Created":"2018-08-26T13:37:05.65Z", "Container":"", "ContainerConfig":{ "Hostname":"", "Domainname":"", "User":"", "AttachStdin":false, "AttachStdout":false, "AttachStderr":false, "Tty":false, "OpenStdin":false, "StdinOnce":false, "Env":null, "Cmd":null, "Image":"", "Volumes":null, "WorkingDir":"", "Entrypoint":null, "OnBuild":null, "Labels":null }, "DockerVersion":"", "Author":"", "Config":{ "Hostname":"", "Domainname":"", "User":"", "AttachStdin":false, "AttachStdout":false, "AttachStderr":false, "ExposedPorts":{ "8080/tcp":{} }, "Tty":false, "OpenStdin":false, "StdinOnce":false, "Env":[ "PATH=/opt/jdk1.8.0_172/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "JAVA_HOME=/opt/jdk1.8.0_172" ], "Cmd":[], "Image":"", "Volumes":null, "WorkingDir":"", "Entrypoint":[ "java", "-Xms512m", "-cp", "/app/resources/:/app/classes/:/app/libs/*", "com.example.JibDemoApplication" ], "OnBuild":null, "Labels":{} }, "Architecture":"amd64", "Os":"linux", "Size":186079594, "VirtualSize":186079594, "GraphDriver":{ "Data":null, "Name":"aufs" }, "RootFS":{ "Type":"layers", "Layers":[ "sha256:cd7100a72410606589a54b932cabd804a17f9ae5b42a1882bd56d263e02b6215", "sha256:317e0b42ef29551507adc792c2dbc389af85c5d68900cf0f08abe907cbd4e199", "sha256:d6fd5302a9ee64c43b46153e9678153819d6d0e247381acbbe6cbe6ed9de0366", "sha256:417c6bd0930eb69d17ae5d601898a6a012900ca33c69e612840a3042b2451cbb", "sha256:8309a5eed5158c5639acb664312ddc7027a2ecb172744f548d6d9fb5f918a744", "sha256:6ef8c795d7a5e2a07f51d572a90b820e089f89adf30798193f4f3f410a261415", "sha256:9990447f3d37e3f2dc70718d0ea6602cf7843091d8bbe395f552c9c5dd10551c", "sha256:ff7910aaeee962d1d86e00742030378a2758da59d8c8cda3fe44314bbddd8081" ] }, "Metadata":{ "LastTagTime":"0001-01-01T00:00:00Z" } } ]
可以看到java-cp指定了/app/libs/、/app/resources/、/app/classes/这三个文件夹
小结
jib默认执行如下操作
COPYlibs/app/libs/ COPYresources/app/resources/ COPYclasses/app/classes/
也就是将libs拷贝到/app/libs,将resources拷贝到/app/resources,将classes拷贝到/app/classes.
doc
- jib
- BuildingDockerImageforaSpringBootAppWithJib
- build-containers-faster-with-jib-a-google-image-build-tool-for-java-applications
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。