如何在不包含源代码的情况下自动构建Docker映像?

时间:2019-10-07 16:34:00

标签: java git maven docker dockerfile

我希望Dockerfile自动克隆我的GitHub存储库,使用Maven构建.jar文件,最后在图像中使用所说的.jar文件,而不包括源文件或Git和Maven软件包。

这是可能的,还是我必须在Dockerfile之外手动编译.jar文件,以便在构建时将其复制到映像中?

我的目标是让DockerHub在每次向其推送新代码时自动重建项目的映像。

此刻,我的Dockerfile安装了Git和Maven,克隆了我的存储库并编译了.jar文件。效果很好,但由于Git和Maven软件包仍安装在映像中,因此感觉不是最佳解决方案。

#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"]

我知道有Maven插件可以在我决定构建项目时构建并推送Docker映像,但这并不是我真正想要的方式。我希望DockerHub上的自动化构建可以为我完成,而无需包含任何软件包或源。

1 个答案:

答案 0 :(得分:2)

一种方法是使用多阶段构建,如此处所述:https://docs.docker.com/develop/develop-images/multistage-build/

多阶段构建允许您在一个阶段中安装构建依赖项并构建发布工件,然后仅将构建工件复制到最终映像。

例如:

#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"]