背景關系:按照使用生成的 jar 檔案通過 Docker 運行應用程式的最常見建議,我可以使用以下內容在本地進行 dockerize 和運行我的 Springboot 應用程式。
問題:由于將 jar 檔案推送到 repo 是不好的做法,因為它可能包含來自本地 application.yml 檔案的機密,并且 docker 檔案取決于 jar 檔案,我怎樣才能讓我的應用程式不僅在本地被 dockerized但是在任何 cicd 管道中的云上?我的下一步是修改 dockerfile 以復制專案目錄,并自己處理生成 jar 檔案嗎?或者我應該根本不使用 jar 并復制目錄并使用 CMD [Some Spring Run command)]
Docker檔案:
FROM maven:3.8.5-openjdk-17
ADD target/xyz.jar xyz.jar
ENV RESTFUL_PORT 8080
ENV PORT_POSTGRES 5432
EXPOSE $RESTFUL_PORT
EXPOSE $PORT_POSTGRES
ENTRYPOINT ["java", "-jar","/xyz.jar"]
生成 jar 檔案的 pom.xml 插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
碼頭工人步驟
- 構建罐子:
mvn clean install - 構建影像:
docker build -t xyz -f Dockerfile - 運行影像:
docker run -d -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=dev" xyz
uj5u.com熱心網友回復:
Dockerfile可以是這樣的:
# Build Stage
FROM maven:3.8-openjdk-17-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
# Execution Stage
FROM openjdk:17-oracle
COPY --from=build /home/app/target/demo-0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]
構建 docker 鏡像
$ docker build -t demo-app:1.0 .
運行 docker 鏡像
$ docker run -p 8080:8080 demo-app:1.0
簡單的構建部分pom.xml將起作用
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
uj5u.com熱心網友回復:
FROM maven:3.8-openjdk-17-slim AS build
WORKDIR /workspace/app
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src
RUN mvn -f /workspace/app/pom.xml install
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)
FROM openjdk:17-oracle
VOLUME /tmp
ARG DEPENDENCY=/workspace/app/target/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com.demo.DemoServiceApplication"]
得到它的作業,只需要改變最后一行。
碼頭工人命令:
- docker build -t 演示 -f Dockerfile 。
- docker run -d -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=develop" 演示:最新
這導致 DockerFile 不依賴于外部 jar 檔案,并且可以針對 cicd 管道的 repo 單獨運行。
來源:Toptal - 多階段構建
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/504083.html
