我希望我的Dockerfile自动复制我的GitHub仓库,使用Maven打造.jar-file最后使用表示.jar-file在image不包括源文件或Git和Maven包。

这是可能的,还是我不得不手动编译我.jar-file的Dockerfile之外,必须建设时,将它复制到image?

我的目标是有DockerHub自动重建我的项目的image每当我推新代码给它。

此刻,我的Dockerfile安装Git和Maven,克隆我的资料库和编译.jar-file。这工作得很好,但感觉并不像最佳的解决方案,因为Git和Maven包保持安装在image。

#Where we start
FROM openjdk:12-alpine

#Get APK up to date
RUN apk update && apk upgrade

#Install Maven
RUN apk add maven

#Git
RUN apk add git
RUN mkdir /HungryBoiiGit
RUN git clone https://github.com/hannesknutsson/HungryBoii.git /HungryBoiiGit

#Build
RUN mvn -f /HungryBoiiGit clean install

#Save result
RUN mkdir /Executables
RUN cp -r /HungryBoiiGit/target/HungryBoii-distributable/* /Executables

#Remove Git repo
RUN rm -rf /HungryBoiiGit

#Add user and group for running as unprivileged user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

#Define how to start
WORKDIR /Executables
ENTRYPOINT ["java", "-jar", "HungryBoii-1.0-SNAPSHOT.jar"]

据我所知,是建立和推动Docker image每当我决定建立我的项目maven插件,但是这只是不是真的我怎么想这样做。我想在DockerHub自动构建做到这一点对我来说,没有被列入任何软件包或来源。

分析解答

一种方法是使用这里描述的多级编译:https://docs.docker.com/develop/develop-images/multistage-build/

多级构建允许安装编译依赖,并在一个阶段建立自己的发行假象,然后就生成工件复制到最终image。

例如:

#Where we start
FROM openjdk:12-alpine AS builder

#Get APK up to date
RUN apk update && apk upgrade

#Install Maven
RUN apk add maven

#Git
RUN apk add git
RUN mkdir /HungryBoiiGit
RUN git clone https://github.com/hannesknutsson/HungryBoii.git /HungryBoiiGit

#Build
RUN mvn -f /HungryBoiiGit clean install

# Build release image
FROM openjdk:12-alpine

#Copy result
WORKDIR /Executables
COPY --from=builder /HungryBoiiGit/target/HungryBoii-distributable .

#Add user and group for running as unprivileged user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

#Define how to start
ENTRYPOINT ["java", "-jar", "HungryBoii-1.0-SNAPSHOT.jar"]