使用Dockerfile构建含私有Maven仓库依赖包的Java容器

背景

  • 需要用JDBC方式访问ArgoDB
  • 星环提供了ArgoDB jar包
  • 应用将以Container的方式运行
  • 我希望打包成镜像之后,镜像启动就能测试连接是否成功
  • 连接URL串需要能够传递进去

失败的方案一:本地文件导入POM

  1. pom.xml 配置本地路径
        <dependency>
            <groupId>com.transwarpgroupId>
            <artifactId>inceptor-driverartifactId>
            <version>8.31.2version>
            <scope>systemscope>
            <systemPath>${project.basedir}/lib/inceptor-driver-8.31.2.jarsystemPath>
        dependency>
  1. Cursor中可以正常builder,也能正常run java程序,构建成镜像后,构建后的jar包和inceptor-driver-8.31.2.jar都在目录下,但是java -cp -jar执行指定classpath不生效。执行docker run的时候一直提示找不到 Hive 驱动。

失败的方案二:mvn install到本地仓库

通过mvn:install将本地文件安装到本地仓库,docker builder构建时提示无法找到对应的文件,写这文章的时候想通了,我只在宿主机安装了,没有在docker builder 执行安装,放到镜像内的maven仓库,所以在执行docker builder的时候会报错找不到这个镜像

宿主机上的命令如下:

mvn install:install-file \
   -Dfile=lib/inceptor-driver-8.31.2.jar \
   -DgroupId=com.transwarp \
   -DartifactId=inceptor-driver \
   -Dversion=8.31.2 \
   -Dpackaging=jar

成功的方案三:上传到私仓,Shade打包所有依赖在一个镜像

  1. pom.xml文件
……
   
    <repositories>
        <repository>
            <id>maven-publicid>
            <name>Maven Public Repositoryname>
            <url>http://x.x.x.x:xxxx/repository/maven-public/url>
            <releases>
                <enabled>trueenabled>
            releases>
            <snapshots>
                <enabled>falseenabled>
            snapshots>
        repository>
    repositories>

    <dependencies>
        
        <dependency>
            <groupId>com.transwarpgroupId>
            <artifactId>inceptor-driverartifactId>
            <version>8.31.2version>
        dependency>
……
    dependencies>

    <build>
        <plugins>  
……
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-shade-pluginartifactId>
                <version>3.2.4version>
                <executions>
                    <execution>
                        <phase>packagephase>
                        <goals>
                            <goal>shadegoal>
                        goals>
                        <configuration>
                            <createDependencyReducedPom>falsecreateDependencyReducedPom>
                            <minimizeJar>falseminimizeJar>
                            <shadedArtifactAttached>trueshadedArtifactAttached>
                            <shadedClassifierName>with-dependenciesshadedClassifierName>
                            <filters>
                                <filter>
                                    <artifact>*:*artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SFexclude>
                                        <exclude>META-INF/*.DSAexclude>
                                        <exclude>META-INF/*.RSAexclude>
                                    excludes>
                                filter>
                            filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>argo.db.connect.example.MainmainClass>
                                transformer>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer"/>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
                                    <addHeader>falseaddHeader>
                                transformer>
                            transformers>
                            <artifactSet>
                                <includes>
                                    <include>*:*include>
                                includes>
                            artifactSet>
                        configuration>
                    execution>
                executions>
            plugin>
            <plugin>
                <groupId>org.codehaus.mojogroupId>
                <artifactId>exec-maven-pluginartifactId>
                <version>3.1.0version>
                <configuration>
                    <classpathScope>systemclasspathScope>
                configuration>
            plugin>
        plugins>
    build>
project> 
  1. Dockerfile配置文件内容,分为构建阶段和运行阶段两个包
# -----------
# 构建阶段
# -----------
FROM maven:eclipse-temurin AS builder

# 设置工作目录
WORKDIR /build

# 配置阿里云镜像源
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list

# 配置 Maven settings.xml
RUN mkdir -p /root/.m2 && \
    echo '' > /root/.m2/settings.xml && \
    echo ' >> /root/.m2/settings.xml && \
    echo '          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' >> /root/.m2/settings.xml && \
    echo '          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">' >> /root/.m2/settings.xml && \

# 启用私仓mirror
    echo '    ' >> /root/.m2/settings.xml && \
    echo '        ' >> /root/.m2/settings.xml && \
    echo '            maven-public' >> /root/.m2/settings.xml && \
    echo '            central,!plugin-central' >> /root/.m2/settings.xml && \

# 记得使用public URL,本地私仓和互联网仓库合并的group
    echo '            http://x.x.x.x:xxxx/repository/maven-public/' >> /root/.m2/settings.xml && \
    echo '        ' >> /root/.m2/settings.xml && \
    echo '        ' >> /root/.m2/settings.xml && \

# 允许私仓的http协议访问
    echo '            maven-default-http-blocker' >> /root/.m2/settings.xml && \
    echo '            external:http:*' >> /root/.m2/settings.xml && \
    echo '            Pseudo repository to mirror external repositories initially using HTTP.' >> /root/.m2/settings.xml && \
    echo '            http://x.x.x.x:xxxx/' >> /root/.m2/settings.xml && \
    echo '            false' >> /root/.m2/settings.xml && \
    echo '        ' >> /root/.m2/settings.xml && \
    echo '    ' >> /root/.m2/settings.xml && \
    echo '' >> /root/.m2/settings.xml

# 复制 pom.xml 和 lib 目录
COPY pom.xml .
COPY lib/ lib/

# 复制源代码
COPY src/ src/

# 构建项目
RUN mvn clean package

# -----------
# 运行阶段
# -----------
FROM eclipse-temurin

# 设置工作目录
WORKDIR /app

# 从构建阶段复制构建好的 jar 文件
COPY --from=builder /build/target/argo-db-connect-example-1.0-SNAPSHOT-with-dependencies.jar /app/app.jar

# 暴露端口
EXPOSE 8080

# 运行应用
ENTRYPOINT ["java", "-Xmx512m", "-Xms256m", "-cp", ".", "-jar", "app.jar"] 
# 允许传参进入容器内的Java进程,使用方法docker run -it -p 8080:8080 argo-db-connect-example:latest "jdbc:transwarp2://x.x.x.x:10000/dwd;user=xxxx;password=xxxx"
CMD ["jdbc:transwarp2://x.x.x.x:10000/dwd;user=xxxx;password=xxxx"]
  1. 导出镜像备用,可以开一下gzip,镜像压缩1/3,更节省空间
docker save argo-db-connect-example | gzip > argo-db-connect-example.tgz

你可能感兴趣的:(使用Dockerfile构建含私有Maven仓库依赖包的Java容器)