使用Dockerfile构建含私有Maven仓库依赖包的Java容器
背景
- 需要用JDBC方式访问ArgoDB
- 星环提供了ArgoDB jar包
- 应用将以Container的方式运行
- 我希望打包成镜像之后,镜像启动就能测试连接是否成功
- 连接URL串需要能够传递进去
失败的方案一:本地文件导入POM
- pom.xml 配置本地路径
<dependency><groupId>com.transwarp</groupId><artifactId>inceptor-driver</artifactId><version>8.31.2</version><scope>system</scope><systemPath>${project.basedir}/lib/inceptor-driver-8.31.2.jar</systemPath></dependency>
- 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打包所有依赖在一个镜像
- pom.xml文件
……<!-- 配置私仓地址 --><repositories><repository><id>maven-public</id><name>Maven Public Repository</name><url>http://x.x.x.x:xxxx/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></repository></repositories><dependencies><!-- 正常引用依赖 --><dependency><groupId>com.transwarp</groupId><artifactId>inceptor-driver</artifactId><version>8.31.2</version></dependency>
……</dependencies><build><plugins>
……<!-- 执行shade打包,所有依赖都进入一个jar文件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><createDependencyReducedPom>false</createDependencyReducedPom><minimizeJar>false</minimizeJar><shadedArtifactAttached>true</shadedArtifactAttached><shadedClassifierName>with-dependencies</shadedClassifierName><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>argo.db.connect.example.Main</mainClass></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>false</addHeader></transformer></transformers><artifactSet><includes><include>*:*</include></includes></artifactSet></configuration></execution></executions></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.1.0</version><configuration><classpathScope>system</classpathScope></configuration></plugin></plugins></build>
</project>
- 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 '<?xml version="1.0" encoding="UTF-8"?>' > /root/.m2/settings.xml && \echo '<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"' >> /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 && \# 启用私仓mirrorecho ' <mirrors>' >> /root/.m2/settings.xml && \echo ' <mirror>' >> /root/.m2/settings.xml && \echo ' <id>maven-public</id>' >> /root/.m2/settings.xml && \echo ' <mirrorOf>central,!plugin-central</mirrorOf>' >> /root/.m2/settings.xml && \# 记得使用public URL,本地私仓和互联网仓库合并的groupecho ' <url>http://x.x.x.x:xxxx/repository/maven-public/</url>' >> /root/.m2/settings.xml && \echo ' </mirror>' >> /root/.m2/settings.xml && \echo ' <mirror>' >> /root/.m2/settings.xml && \# 允许私仓的http协议访问echo ' <id>maven-default-http-blocker</id>' >> /root/.m2/settings.xml && \echo ' <mirrorOf>external:http:*</mirrorOf>' >> /root/.m2/settings.xml && \echo ' <name>Pseudo repository to mirror external repositories initially using HTTP.</name>' >> /root/.m2/settings.xml && \echo ' <url>http://x.x.x.x:xxxx/</url>' >> /root/.m2/settings.xml && \echo ' <blocked>false</blocked>' >> /root/.m2/settings.xml && \echo ' </mirror>' >> /root/.m2/settings.xml && \echo ' </mirrors>' >> /root/.m2/settings.xml && \echo '</settings>' >> /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"]
- 导出镜像备用,可以开一下gzip,镜像压缩1/3,更节省空间
docker save argo-db-connect-example | gzip > argo-db-connect-example.tgz