maven docker 插件集成的幾個小坑
昨晚看springboot視頻的時候,發現可以使用docker-maven-plugin這個插件直接build出 docker 鏡像到遠程服務器上,感覺很方便,於是自己也試了一下,但是碰到了幾個問題,記錄一下。
一、開啟docker遠程端口
視頻中使用的是centos,然而我是Ubuntu。好吧,其實沒啥區別,但是還是有一點小區別的,,比如文件位置不同。
Ubuntu下需要編輯的文件為
vim /etc/default/docker
在最後一行加上
DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://0.0.0.0:6732"
好,我們把端口設置為了6732,視頻中就講了這個,可能是系統原因,此時我本地用 Telnet 訪問這個端口是不通的。
我們還需要
vim /lib/systemd/system/docker.service
增加一行
EnvironmentFile=-/etc/default/docker
指定使用我們剛才編輯的文件
然後修改
ExecStart=/usr/bin/dockerd -H fd://
為
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
其實就是指定使用我們剛才編輯的參數
好了,此時Telnet 通了。
二、配置pom文件
按照視頻中的寫法
在properties中增加一行指定遠程主機的位置,端口為我們剛才配置的6732
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <dockerHost>http://x.x.x.x:6732</dockerHost> </properties>
然後增加一個plugin
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <!-- imageName>mavenTest</imageName> --> <imageName>java</imageName> <baseImage>java</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
然後我們執行 mvn -DskipTests clean package docker:build
好,build成功。
問題來了,按照這樣寫是沒問題的。
但是我突然想到怎麽指定我build出來的image名稱呢。然後我就把imageName改為了mavenTest
然後就報錯了。。。
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:0.4.3:build (default-cli) on project mavenTest: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.client.ClientProtocolException: Cannot retry request with a non-repeatable request entity: Connection reset by peer -> [Help 1]
看這個錯一臉懵逼,鏈接出錯???剛還不是好的嗎。又把名字換成java,又可以了。。於是百度了一下,有的說升級版本成0.4.4就可以了,有的說升級成1.0.0可以,然而,並沒有什麽用。
百度提供的有效信息就這麽多了,,
於是去 GitHub上看了下,終於在 issues 中發現這樣一個問題,
User could be warned if an illegal image name is specified
I have struggled for some time now with a strange problem, where mvn docker:build failed; amongst the error output, "Connection Reset" was found. I finally figured out what caused the issue: My maven project‘s artifact ID had upper-case letters in it, and I am using ${myPrefix}/${project.artifactId} as the image name. However, docker seems to not allow upper-case letters for images names.
看起來是我一樣的問題,他說他的項目名中有大寫字母,,,,,看到這裏,恍然大悟,把imageName 改成 ttt 試了下,果然可以。。
最後想說一下,,其實這個錯誤是不應該犯得,因為視頻中講了image的命名規範
only [a-z0-9-_.]
沒仔細看,,浪費一個小時。。
maven docker 插件集成的幾個小坑