1. 程式人生 > >maven docker 插件集成的幾個小坑

maven docker 插件集成的幾個小坑

telnet service skip could 服務 request execution 系統 怎麽

昨晚看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 插件集成的幾個小坑