咱们常见开源项目中使用的Docker Maven插件是com.spotify:docker-maven-plugin
。可用版本信息见Github。git
经过其介绍可知该插件已经再也不推荐使用,取而代之的是com.spotify:dockerfile-maven-plugin
,Maven中央仓库,Github地址。github
使用该插件能够在mvn
命令中直接构建出Docker镜像和完成推送等。spring
dockerfile-maven-plugin
要求用户必须提供Dockerfile用于构建镜像,从而将Docker镜像的构建依据统一到Dockerfile上,这与过期的docker-maven-plugin
是不一样的。docker
该插件的开源主页提供了丰富的参考资料:vim
使用该插件时,有一些注意事项tcp
DOCKER_HOST
选项,指向Docker Host对应端口vim /usr/lib/systemd/system/docker.service
找到ExecStart=
所在的那一行,在以后添加:ide
-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
从新加载并重启Docker,确认端口2375是否启用:
systemctl daemon-reload systemctl restart docker netstat -an | grep 2375
注意
Windows下
set DOCKER_HOST=tcp://x.x.x.x:2375
使用TLS时,更全面的参数设置,好比:
SET DOCKER_TLS_VERIFY=1 SET DOCKER_HOST=tcp://192.168.0.100:2376 SET DOCKER_CERT_PATH=C:\Users\kevin\.docker\machine\machines\remote-docker-host SET DOCKER_MACHINE_NAME=remote-docker-host
请参考:
https://www.kevinkuszyk.com/2016/11/28/connect-your-docker-client-to-a-remote-docker-host/
构建镜像免不了获取基础镜像,须要得到指定Registry的访问权限。
能够将登陆信息放在POM中实现认证
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${version}</version> <configuration> <username>repoUserName</username> <password>repoPassword</password> <repository>${docker.image.prefix}/${project.artifactId}</repository> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
与认证相关的是其中的username
和password
元素,
repository
是目标Docker Registry,是获取基础镜像,上传镜像产品的地方。
该方法将认证信息存放在Maven的Settings文件中:
<servers> <server> <id>docker-repo.example.com:8080</id> <username>me</username> <password>mypassword</password> </server> </servers>
而后在POM的插件配置中,以下配置:
<configuration> <repository>docker-repo.example.com:8080/organization/image</repository> <tag>latest</tag> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> </configuration>
注意useMavenSettingsForAuth
元素说明认证信息从Settings获取,要求repository
对应的Registry必须在Settings中有认证配置。
这种方法不在POM和Settings中保存认证信息,而是在构建的mvn
命令中动态输入Registry的用户名和密码 :
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${version}</version> <configuration> <repository>${docker.image.prefix}/${project.artifactId}</repository> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
构建命令:
mvn GOAL -Ddockerfile.username=... -Ddockerfile.password=...
先看一个基本的使用样例:
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${dockerfile-maven-version}</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>spotify/foobar</repository> <tag>${project.version}</tag> <dockerfile>Dockerfile</dockerfile> <contextDirectory>${project.basedir}</contextDirectory> <buildArgs> <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin>
execution
指定了该插件build
和push
两个目标使用默认绑定,默认的,build
和tag
目标绑定到package
阶段,push
目标绑定到deploy
阶段,这里不涉及tag
目标。tag
元素指定镜像的tag,这里使用Maven模块的版本号;target/${project.build.finalName}.jar
为项目构建生成的JAR包路径dockerfile
元素指定Dockerfile的位置,上例中为和POM在同级目录;使用contextDirectory
元素指定Docker构建上下文目录,上例中是该Maven项目的根目录。buildArgs
元素指定了传递给Dockerfile的参数,好比上例中的JAR_FILE
,相应的,Dockerfile中就可使用该参数:# ... ARG JAR_FILE COPY ${JAR_FILE} /var/app.jar #...
注意到咱们在Dockerfile中只需声明JAR_FILE
而不用手动赋值,便可在后面的构建指令中使用。
若是要临时跳过全部的Dockerfile相关的目标,执行以下Maven命令:
mvn clean install -Ddockerfile.skip
若是只是想跳过某一个goal,执行以下Maven命令:
mvn clean package -Ddockerfile.build.skip mvn clean package -Ddockerfile.tag.skip mvn clean deploy -Ddockerfile.push.skip
一些能够参考的资源:
https://blog.csdn.net/taiyangdao/article/details/79817787#commentsedit