zoukankan      html  css  js  c++  java
  • 使用Dockerfile Maven插件

    我们常见开源项目中使用的Docker Maven插件是com.spotify:docker-maven-plugin。可用版本信息见Github

    通过其介绍可知该插件已经不再推荐使用,取而代之的是com.spotify:dockerfile-maven-pluginMaven中央仓库Github地址

    使用该插件可以在mvn命令中直接构建出Docker镜像和完成推送等。

    dockerfile-maven-plugin要求用户必须提供Dockerfile用于构建镜像,从而将Docker镜像的构建依据统一到Dockerfile上,这与过时的docker-maven-plugin是不同的。

    该插件的开源主页提供了丰富的参考资料:

    使用该插件时,有一些注意事项

    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=所在的那一行,在之后添加:

    -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:Userskevin.dockermachinemachines
    emote-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/

  • 相关阅读:
    GeoServer与Spring MVC
    GeoServer二次开发1 hello Geoserver
    servlet的生命周期
    springboot打包出错,没有主清单
    空间数据库管理
    Gone with the wind
    谎言中的民众
    还是有些怀念这里啊
    MSN Protcol 学习笔记
    祝我的老师教师节快乐!
  • 原文地址:https://www.cnblogs.com/zyon/p/11266952.html
Copyright © 2011-2022 走看看