我希望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上的自动化构建可以为我完成,而无需包含任何软件包或源。
答案 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"]