Gradle / Maven을 사용하는 SpringBoot 앱용 일반 Docker 이미지 및 Dockerfile

Marcello de Sales

https://spring.io/guides/gs/spring-boot-docker/ 에 따르면 하드 코딩 된 이름과 애플리케이션 버전을 사용하여 SpringBoot 애플리케이션 용 Docker 이미지를 만들 수 있습니다. 예를 들면 :

src / 메인 / 도커 / 도커 파일

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD gs-spring-boot-docker-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

그러나 앱의 이름이나 버전을 변경하면 build.gradle 작업에 배치하는 Docker Build 명령이 중단됩니다.

build.gradle

task buildDocker(type: Docker, dependsOn: build) {
  push = true
  applicationName = jar.baseName
  dockerfile = file('src/main/docker/Dockerfile')
  doFirst {
    copy {
      from jar
      into stageDir
    }
  }
}

gradle buildDocker 명령은 앱에서 Dockerfile 및 실행 가능한 Jar를 스테이징하고 "docker build"를 실행하여 이미지를 빌드합니다.

질문

Dockerfile에서 이름이 정적 인 것을 고려할 때 버전을 변경하면 빌드가 손상되지 않도록이 설정을 변경하거나 Docker 이미지를 빌드 할 때 SpringBoot 애플리케이션의 이름을 어떻게 변경할 수 있습니까?

Marcello de Sales

Maven을 사용하는 SpringBoot 앱용 일반 다단계 Dockerfile

  • 여러 dockerfiles https://docs.docker.com/develop/develop-images/multistage-build 를 유지하는 대신 다단계 빌드를 사용하여 Springboot 앱용 일반 Dockerfile의 새 버전을 작업했습니다.
    • 이것은 Maven. 유사한 접근 방식을 Gradle.
  • 테스트 케이스를 실행 한 다음 런타임 이미지를 빌드합니다.
    • 테스트 실행에서 종속성 다운로드 분할 지원
    • 테스트 단계를 별도로 구축 docker build -t tests --target builder .
    • 코드 검사를 사용하여 기본적으로 단위 테스트를 실행합니다.
    • 스위치에서 통합 테스트를 실행합니다 mvn -s settings.xml -Dtest="!*IT,!*IntegrationTest" -P jacoco test.
  • 지원은 제공 JAVA_PARAMSJAVA_OPTS디버깅 아무것도 필요
    • Docker Swarm 또는 Kubernetes Helm에이 이미지를 배포하는 경우.
  • Maven 리포지토리 서버 (공개 또는 개인)를 가리키는 settings.xml을 제공합니다.

아래 빌드는 다음을 수행합니다.

#
# Build stage to for building the Jar
#
FROM maven:3.2.5-jdk-8 as builder
MAINTAINER [email protected]

# Only copy the necessary to pull only the dependencies from Intuit's registry
ADD ./pom.xml /opt/server/pom.xml
# As some entries in pom.xml refers to the settings, let's keep it same
ADD ./settings.xml /opt/server/settings.xml

WORKDIR  /opt/server/

# Prepare by downloading dependencies
RUN mvn -s settings.xml -B -e -C -T 1C org.apache.maven.plugins:maven-dependency-plugin:3.0.2:go-offline

# Run the full packaging after copying the source
ADD ./src /opt/server/src
RUN mvn -s settings.xml install -P embedded -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -B -e -o -T 1C verify

# Building only this stage can be done with the --target builder switch
# 1. Build: docker build -t config-builder --target builder .
# When running this first stage image, just verify the unit tests
# Overriden them by removing the "!" for integration tests
# 2. docker run --rm -ti config-builder mvn -s settings.xml -Dtest="*IT,*IntegrationTest" test
CMD mvn -s settings.xml -Dtest="!*IT,!*IntegrationTest" -P jacoco test

#
# Build stage with the runtime jar and resources
#
FROM openjdk:8-jre-slim

# Copy from the previous stage
COPY --from=builder /opt/server/target/*.jar /tmp/

# Just rename the built version
RUN mkdir /runtime && \
    find /tmp -name "*.jar" ! -name "*sources*" -exec cp -t /runtime {} + && \
    mv /runtime/*.jar /runtime/server.jar && \
    rm -f /tmp/*.jar

# Port used by the server
EXPOSE 8888

# This is to support HTTPS calls to
RUN apt-get update && apt-get install -y curl ca-certificates
RUN update-ca-certificates && \
   mkdir -p /usr/share/ssl/certs && \
   chmod 755 /usr/share/ssl/certs

# What to execute on docker run
ENTRYPOINT sh -c "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom \
           $JAVA_PARAMS -jar /runtime/server.jar --server.port=8888 $SPRING_BOOT_APP_OPTS"

테스트 빌드 및 실행

  • 다단계 빌드 사양에 따라 이제 테스트 이미지 만 생성 할 수 있습니다.
    • 여러 유형의 테스트 (단위, 통합)의 경우 실행을 분할 할 수 있습니다.

따라서 테스트 빌드는 다음과 같이 수행 할 수 있습니다.

$ docker build -t generic-dockerfile:tests --target builder .
Sending build context to Docker daemon  16.82MB
Step 1/9 : FROM maven:3.2.5-jdk-8 as builder
 ---> 95dd59c15f5d
Step 2/9 : MAINTAINER [email protected]
 ---> Using cache
 ---> e4edaeb48381
Step 3/9 : ADD ./pom.xml /opt/server/pom.xml
 ---> Using cache
 ---> b2d6d834b411
Step 4/9 : ADD ./settings.xml /opt/server/settings.xml
 ---> Using cache
 ---> 9b0964db2c9f
Step 5/9 : WORKDIR  /opt/server/
 ---> Using cache
 ---> 542d0bd9d12f
Step 6/9 : RUN mvn -s settings.xml -B -e -C -T 1C org.apache.maven.plugins:maven-dependency-plugin:3.0.2:go-offline
 ---> Using cache
 ---> 3c2d8df6b52e
Step 7/9 : ADD ./src /opt/server/src
 ---> Using cache
 ---> 6d48dd3f9f85
Step 8/9 : RUN mvn -s settings.xml install -P embedded -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -B -e -o -T 1C verify
 ---> Using cache
 ---> 1c109d2026c4
Step 9/9 : CMD mvn -s settings.xml -Dtest="!*IT,!*IntegrationTest" -P jacoco test
 ---> Using cache
 ---> 45eac3094ea4
Successfully built 45eac3094ea4
Successfully tagged generic-dockerfile:tests

그런 다음 테스트를 실행할 수 있습니다.

$ docker run -ti generic-dockerfile:tests
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-cloud-config-server 1.1.6-SNAPSHOT
[INFO] ------------------------------------------------------------------------
  • CMD 인수를 재정 의하여 위의 Dockerfile에 설명 된대로 통합 테스트를 실행할 수도 있습니다.

앱 빌드 및 실행

평소대로 런타임 이미지를 빌드 할 수 있습니다.

$ docker build -t generic-dockerfile .

done.
done.
Removing intermediate container e632d7c310f7
 ---> e9391a0ca21d
Step 16/16 : ENTRYPOINT sh -c "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom            $JAVA_PARAMS -jar /runtime/server.jar --server.port=8888 $SPRING_BOOT_APP_OPTS"
 ---> Running in 849ba7ad3212
Removing intermediate container 849ba7ad3212
 ---> 909354984264
Successfully built 909354984264
Successfully tagged generic-dockerfile:latest

애플리케이션 실행은 다음과 같이 간단합니다.

$ docker run -ti generic-dockerfile
ThisHost: getLocalHost says localHost="c34b2cedbebf/172.17.0.2" isLoopbackAddress=false
   2018-04-19T19:15:41,180 3166  | INFO  | internal.util.Version.<clinit>#30 ["background-preinit" {}] HV000001: Hibernate Validator 5.2.5.Final
   2018-04-19T19:15:41,470 3456  | INFO  | factory.annotation.AutowiredAnnotationBeanPostProcessor.<init>#155 ["main" {svr=c34b2cedbebf}] JSR-330 'javax.inject.Inject' annotation found and supported for autowiring

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Docker는 볼륨에 Dockerfile 및 영구 도우미 파일을 사용하여 이미지를 만듭니다.

분류에서Dev

Dockerfile.dev 및 Yarn을 사용하여 반응 앱을 빌드하는 방법

분류에서Dev

Python 용 Docker SDK : 사용자 지정 Dockerfile 및 사용자 지정 컨텍스트를 사용하여 이미지를 빌드하는 방법

분류에서Dev

Docker 이미지에서 파일을 복사하는 방법-DockerFile cmd

분류에서Dev

Dockerfile을 사용하여 절대 경로가있는 파일을 Docker 컨테이너에 복사

분류에서Dev

Docker-compose && dockerfile을 사용하는 Mac OS의 Docker 파일 권한 PHP

분류에서Dev

ring 및 gradle을 사용하는 html 페이지 경로

분류에서Dev

데이터베이스 생성을 포함하는 dockerfile을 사용하여 Docker 이미지를 빌드하는 방법

분류에서Dev

Docker 및 Gradle을 사용하는 스프링 클라이언트에서 연결이 거부되었습니다.

분류에서Dev

mailApp을 사용하여 이미지 및 기타 이메일을

분류에서Dev

Quarkus를 사용하여 Docker 이미지 (Kotlin 및 Gradle 사용)에서 네이티브 이미지를 빌드하려면 어떻게해야합니까?

분류에서Dev

Docker-compose는 작동하지만 Dockerfile을 사용하는 Docker는 작동하지 않습니다. 왜?

분류에서Dev

Docker 이미지에서 sh 파일을 사용하여 maven 명령을 실행할 수 없습니다.

분류에서Dev

CSV 파일 및 Python을 사용하는 다중 이미지 다운로더

분류에서Dev

gradle 및 querydsl을 사용하는 IntelliJ

분류에서Dev

XML 파일에서 XSLT를 사용하여 웹 페이지에 기반한 앵커 URL 및 제목을 표시하고 이미지를 삽입하는 방법

분류에서Dev

기록에 저장하지 않고 대용량 파일을 Docker 이미지로 복사하는 방법

분류에서Dev

Docker는 이미지를 업데이트하는 동안 사용자 생성 파일을 보존합니다.

분류에서Dev

Gradle을 사용하여 파일 및 디렉토리 이름을 얻는 방법은 무엇입니까?

분류에서Dev

반응 앱 생성을 사용하는 동안 src 및 공용 폴더가 생성되지 않습니다.

분류에서Dev

docker-compose 또는 dockerfile을 사용하여 디렉토리 마운트 (복사하지 않음)

분류에서Dev

Dockerfile을 사용할 때는 컨테이너가 작동하지만 docker-compose.yml을 사용할 때는 작동하지 않습니다.

분류에서Dev

사용자 지정 경로 및 사용자 지정 파일 이름이 작동하지 않는 Docker 빌드

분류에서Dev

Dockerfile을 사용하여 Ubuntu 이미지를 기반으로하는 php-fpm으로 Nginx를 시작하려면 어떻게해야합니까?

분류에서Dev

Mariadb 이미지 용 Dockerfile

분류에서Dev

awk를 사용하여 두 파일을 병렬로 반복하고 일치 및 일치하지 않는 인쇄

분류에서Dev

install4j 및 gradle을 사용하여 Docker 컨테이너에 Windows 설치 프로그램 빌드

분류에서Dev

iOS 8을 사용하는 웹 앱용 시작 이미지

분류에서Dev

splunk forwarder docker 이미지를 사용하여 로컬 파일을 보내는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Docker는 볼륨에 Dockerfile 및 영구 도우미 파일을 사용하여 이미지를 만듭니다.

  2. 2

    Dockerfile.dev 및 Yarn을 사용하여 반응 앱을 빌드하는 방법

  3. 3

    Python 용 Docker SDK : 사용자 지정 Dockerfile 및 사용자 지정 컨텍스트를 사용하여 이미지를 빌드하는 방법

  4. 4

    Docker 이미지에서 파일을 복사하는 방법-DockerFile cmd

  5. 5

    Dockerfile을 사용하여 절대 경로가있는 파일을 Docker 컨테이너에 복사

  6. 6

    Docker-compose && dockerfile을 사용하는 Mac OS의 Docker 파일 권한 PHP

  7. 7

    ring 및 gradle을 사용하는 html 페이지 경로

  8. 8

    데이터베이스 생성을 포함하는 dockerfile을 사용하여 Docker 이미지를 빌드하는 방법

  9. 9

    Docker 및 Gradle을 사용하는 스프링 클라이언트에서 연결이 거부되었습니다.

  10. 10

    mailApp을 사용하여 이미지 및 기타 이메일을

  11. 11

    Quarkus를 사용하여 Docker 이미지 (Kotlin 및 Gradle 사용)에서 네이티브 이미지를 빌드하려면 어떻게해야합니까?

  12. 12

    Docker-compose는 작동하지만 Dockerfile을 사용하는 Docker는 작동하지 않습니다. 왜?

  13. 13

    Docker 이미지에서 sh 파일을 사용하여 maven 명령을 실행할 수 없습니다.

  14. 14

    CSV 파일 및 Python을 사용하는 다중 이미지 다운로더

  15. 15

    gradle 및 querydsl을 사용하는 IntelliJ

  16. 16

    XML 파일에서 XSLT를 사용하여 웹 페이지에 기반한 앵커 URL 및 제목을 표시하고 이미지를 삽입하는 방법

  17. 17

    기록에 저장하지 않고 대용량 파일을 Docker 이미지로 복사하는 방법

  18. 18

    Docker는 이미지를 업데이트하는 동안 사용자 생성 파일을 보존합니다.

  19. 19

    Gradle을 사용하여 파일 및 디렉토리 이름을 얻는 방법은 무엇입니까?

  20. 20

    반응 앱 생성을 사용하는 동안 src 및 공용 폴더가 생성되지 않습니다.

  21. 21

    docker-compose 또는 dockerfile을 사용하여 디렉토리 마운트 (복사하지 않음)

  22. 22

    Dockerfile을 사용할 때는 컨테이너가 작동하지만 docker-compose.yml을 사용할 때는 작동하지 않습니다.

  23. 23

    사용자 지정 경로 및 사용자 지정 파일 이름이 작동하지 않는 Docker 빌드

  24. 24

    Dockerfile을 사용하여 Ubuntu 이미지를 기반으로하는 php-fpm으로 Nginx를 시작하려면 어떻게해야합니까?

  25. 25

    Mariadb 이미지 용 Dockerfile

  26. 26

    awk를 사용하여 두 파일을 병렬로 반복하고 일치 및 일치하지 않는 인쇄

  27. 27

    install4j 및 gradle을 사용하여 Docker 컨테이너에 Windows 설치 프로그램 빌드

  28. 28

    iOS 8을 사용하는 웹 앱용 시작 이미지

  29. 29

    splunk forwarder docker 이미지를 사용하여 로컬 파일을 보내는 방법은 무엇입니까?

뜨겁다태그

보관