使用Dockerfile Maven插件

咱們常見開源項目中使用的Docker Maven插件是com.spotify:docker-maven-plugin。可用版本信息見Githubgit

經過其介紹可知該插件已經再也不推薦使用,取而代之的是com.spotify:dockerfile-maven-pluginMaven中央倉庫Github地址github

使用該插件能夠在mvn命令中直接構建出Docker鏡像和完成推送等。spring

dockerfile-maven-plugin要求用戶必須提供Dockerfile用於構建鏡像,從而將Docker鏡像的構建依據統一到Dockerfile上,這與過期的docker-maven-plugin是不一樣的。docker

該插件的開源主頁提供了豐富的參考資料:vim

使用該插件時,有一些注意事項tcp

  1. 該插件依賴一臺裝有Docker daemon的Host完成鏡像的構建
  2. 因爲該插件須要訪問Docker Host,所以要求Docker Host打開TCP管理端口,並容許訪問
  3. 使用該插件的機器須要配置DOCKER_HOST選項,指向Docker Host對應端口
  4. 該插件構建和發佈鏡像依賴於鏡像倉庫,須要用戶提供鏡像倉庫的登陸信息,支持POM設置和Settings設置

Docker Host開啓TCP管理端口

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

注意

  1. 這種方法不使用TLS
  2. 還要根據Linux發行版的具體防火牆機制,開發上述管理端口供外部可靠主機訪問

客戶端配置相關參數

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/

POM方式配置Registry認證

構建鏡像免不了獲取基礎鏡像,須要得到指定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>

與認證相關的是其中的usernamepassword元素,

repository是目標Docker Registry,是獲取基礎鏡像,上傳鏡像產品的地方。

Settings方式配置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>
  1. execution指定了該插件buildpush兩個目標使用默認綁定,默認的,buildtag目標綁定到package階段,push目標綁定到deploy階段,這裏不涉及tag目標。
  2. tag元素指定鏡像的tag,這裏使用Maven模塊的版本號;
  3. target/${project.build.finalName}.jar爲項目構建生成的JAR包路徑
  4. 可使用dockerfile元素指定Dockerfile的位置,上例中爲和POM在同級目錄;使用contextDirectory元素指定Docker構建上下文目錄,上例中是該Maven項目的根目錄。
  5. 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

https://www.callicoder.com/spring-boot-docker-example/

https://spring.io/guides/gs/spring-boot-docker/

相關文章
相關標籤/搜索