Free Lines Arrow
본문 바로가기
Development/Docker

[Docker] gradle을 이용한 이미지 생성 및 푸시

by p8labs 2025. 2. 13.
728x90
반응형

개요

자동화를 위해 gradle 파일에 도커 이미지 빌드, 생성, 푸시를 를 작성해 준다.

 

라이브러리

    // Docker
    // https://mvnrepository.com/artifact/com.bmuschko.docker-remote-api/com.bmuschko.docker-remote-api.gradle.plugin
    implementation 'com.bmuschko.docker-remote-api:com.bmuschko.docker-remote-api.gradle.plugin:9.4.0'
// https://mvnrepository.com/artifact/com.bmuschko.docker-java-application/com.bmuschko.docker-java-application.gradle.plugin
    implementation 'com.bmuschko.docker-java-application:com.bmuschko.docker-java-application.gradle.plugin:9.4.0'

 
 
 

gradle 코드

  • 도커는 동일한 패스에 있는 파일만 COPY 가 가능 하기때문에
  • 생성된 jar 파일을 도커 파일이 있는 곳으로 옮겨 줘야 한다.
import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
import com.bmuschko.gradle.docker.tasks.image.DockerPushImage
import com.bmuschko.gradle.docker.tasks.image.Dockerfile

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.4.2'
	id 'io.spring.dependency-management' version '1.1.7'
	id 'com.bmuschko.docker-remote-api' version '9.4.0'
	id 'com.bmuschko.docker-java-application' version '9.4.0'
}

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

ext {
	set('springCloudVersion', "2024.0.0")

	DEFAULT_PROFILE = "local"
	SERVICE_VERSION = new Date().format("yyyyMMddHHmmss", TimeZone.getTimeZone("Asia/Seoul"))
	SERVICE_NAME = 'config-server'

	DEFAULT_DOCKER_HUB_REPOSITORY = 'rnrl1215/p8labs-config'

	def isDepoly = project.hasProperty('isDepoly')
	profile = isDepoly ? project.property("profile") : "${DEFAULT_PROFILE}"
	serviceVersion = isDepoly ? project.property("serviceVersion") : "${SERVICE_VERSION}"
	serviceName = isDepoly ? project.property('serviceName') : "${SERVICE_NAME}"

	dockerRepository = isDepoly ? project.property('dockerRepository') : "${DEFAULT_DOCKER_HUB_REPOSITORY}"
	dockerUser = isDepoly ? project.property('dockerUser') : ""
	dockerPasswd = isDepoly ? project.property('dockerPasswd') : ""

	SERVICE_NAME = serviceName
	SERIVCE_VERSION = serviceVersion
	PROFILE = profile

	DOCKER_REPOSITORY = dockerRepository
	DOCKER_USER = dockerUser
	DOCKER_PASSWORD = dockerPasswd


   	println "[ BUILD INFO ] PROFILE : ${PROFILE}"
	println "[ BUILD INFO ] Service VERSION : ${SERIVCE_VERSION}"
	println "[ BUILD INFO ] Service NAME : ${SERVICE_NAME}"
	println "[ BUILD INFO ] DOCKER USER : ${DOCKER_USER}"
	println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_PASSWORD}"
	println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_REPOSITORY}"

}


group = 'com.p8labs'
version = "${SERIVCE_VERSION}"


// 실행 가능한 JAR 생성 설정
bootJar {
	enabled = true
	archiveBaseName = "${SERVICE_NAME}-${PROFILE}"

	doLast {
		copy {
			def jarFile = tasks.bootJar.archiveFile.get().asFile
			def jarFilePath = jarFile.path

			archiveBaseName = "${SERVICE_NAME}" + "${PROFILE}"
			from jarFilePath
			into getRootDir().path + "/build/docker/"
		}
	}
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-actuator'
	implementation 'org.springframework.cloud:spring-cloud-config-server'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

tasks.named('test') {
	useJUnitPlatform()
}

apply from: 'docker.gradle'

tasks.create('createDockerfile', Dockerfile) {
	def jarFile = tasks.bootJar.archiveFile.get().asFile
	def path = jarFile.getParent();
	def jarFileFulPath =  "/"+ "${SERVICE_NAME}"+"-"+"${PROFILE}"+"-"+"${SERIVCE_VERSION}"+'.jar';
	println "[ CRATE DOCKER FILE INFO ] PATH : ${path}"
	println "[ CRATE DOCKER FILE INFO ] PROFILE : ${PROFILE}"
	println "[ CRATE DOCKER FILE INFO ] SERVICE NAME : ${SERVICE_NAME}"
	println "[ CRATE DOCKER FILE INFO ] SERVICE_VERSION : ${SERIVCE_VERSION}"
	println "[ CRATE DOCKER FILE INFO ] JAR PATH : ${jarFileFulPath}"

	from('openjdk:17-jdk-slim')
	arg("JAR_FILE")

	copyFile(jarFileFulPath, '/'+"${SERVICE_NAME}"+'.jar')
	runCommand("mkdir -p target/dependency && (cd target/dependency; jar -xf /"+"${SERVICE_NAME}"+".jar"+")")
	entryPoint("java", "-jar", "/"+"${SERVICE_NAME}"+".jar")
	exposePort(8071)
}


task buildImage(type: DockerBuildImage) {
	dependsOn createDockerfile
	images.add("${DOCKER_REPOSITORY}"+"-"+"${PROFILE}"+":"+"${SERIVCE_VERSION}")
}

task pushDocker(type: DockerPushImage) {
	dependsOn buildImage  // Docker 이미지 빌드 후 푸시
	images.add("${DOCKER_REPOSITORY}"+"-"+"${PROFILE}"+":"+"${SERIVCE_VERSION}")
	registryCredentials {
		username = "${DOCKER_USER}"
		password = "${DOCKER_PASSWORD}"
	}
}

 
 
 

 

코드 분석

변수 처리 하는 부분

ext {
	set('springCloudVersion', "2024.0.0")

	DEFAULT_PROFILE = "local"
	SERVICE_VERSION = new Date().format("yyyyMMddHHmmss", TimeZone.getTimeZone("Asia/Seoul"))
	SERVICE_NAME = 'config-server'

	DEFAULT_DOCKER_HUB_REPOSITORY = 'rnrl1215/p8labs-config'

	def isDepoly = project.hasProperty('isDepoly')
	profile = isDepoly ? project.property("profile") : "${DEFAULT_PROFILE}"
	serviceVersion = isDepoly ? project.property("buildNumber") : "${SERVICE_VERSION}"
	serviceName = isDepoly ? project.property('serviceName') : "${SERVICE_NAME}"

	dockerRepository = isDepoly ? project.property('dockerRepository') : "${DEFAULT_DOCKER_HUB_REPOSITORY}"
	dockerUser = isDepoly ? project.property('dockerUser') : ""
	dockerPasswd = isDepoly ? project.property('dockerPasswd') : ""

	SERVICE_NAME = serviceName
	SERIVCE_VERSION = serviceVersion
	PROFILE = profile

	DOCKER_REPOSITORY = dockerRepository
	DOCKER_USER = dockerUser
	DOCKER_PASSWORD = dockerPasswd


   	println "[ BUILD INFO ] PROFILE : ${PROFILE}"
	println "[ BUILD INFO ] Service VERSION : ${SERIVCE_VERSION}"
	println "[ BUILD INFO ] Service NAME : ${SERVICE_NAME}"
	println "[ BUILD INFO ] DOCKER USER : ${DOCKER_USER}"
	println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_PASSWORD}"
	println "[ BUILD INFO ] DOCKER PASSWD : ${DOCKER_REPOSITORY}"

}

 

도커 파일 생성

이미지 빌드에 필요한 도커파일을 생성해준다.

apply from: 'docker.gradle'

tasks.create('createDockerfile', Dockerfile) {
	def jarFile = tasks.bootJar.archiveFile.get().asFile
	def path = jarFile.getParent();
	def jarFileFulPath =  "/"+ "${SERVICE_NAME}"+"-"+"${PROFILE}"+"-"+"${SERIVCE_VERSION}"+'.jar';
	println "[ CRATE DOCKER FILE INFO ] PATH : ${path}"
	println "[ CRATE DOCKER FILE INFO ] PROFILE : ${PROFILE}"
	println "[ CRATE DOCKER FILE INFO ] SERVICE NAME : ${SERVICE_NAME}"
	println "[ CRATE DOCKER FILE INFO ] SERVICE_VERSION : ${SERIVCE_VERSION}"
	println "[ CRATE DOCKER FILE INFO ] JAR PATH : ${jarFileFulPath}"

	from('openjdk:17-jdk-slim')
	arg("JAR_FILE")

	copyFile(jarFileFulPath, '/'+"${SERVICE_NAME}"+'.jar')
	runCommand("mkdir -p target/dependency && (cd target/dependency; jar -xf /"+"${SERVICE_NAME}"+".jar"+")")
	entryPoint("java", "-jar", "/"+"${SERVICE_NAME}"+".jar")
	exposePort(8071)
}

 

 

Image buid, push

위에 생성된 도커파일 기반으로 이미지를 생성하고 push 한다.

task buildImage(type: DockerBuildImage) {
	dependsOn createDockerfile
	images.add("${DOCKER_REPOSITORY}"+"/"+"${SERVICE_NAME}"+":"+"${SERIVCE_VERSION}")
}

task pushDocker(type: DockerPushImage) {
	dependsOn buildImage  // Docker 이미지 빌드 후 푸시
	images.add("${DOCKER_REPOSITORY}"+"/"+"${SERVICE_NAME}"+":"+"${SERIVCE_VERSION}")
	registryCredentials {
		username = "${DOCKER_USER}"
		password = "${DOCKER_PASSWORD}"
	}
}

 

명령어 수행

./gradlew clean -x test build 
          -PisDepoly=true 
          -Pprofile=dev 
          -PserviceVersion=0.0.1
          -PserviceName=config-server 
          -PdockerRepository=rnrl1215/p8labs-config 
          -PdockerUser={도커허브 아이디}
          -PdockerPasswd={도커허브 비번} 
          dockerPush

 

 

도커 허브에 올라간 화면

 
 

 

다음으로 

이제 명령어를 알았으니 젠킨스를 통해서 자동 배포를 작업하면 된다.

728x90
반응형

'Development > Docker' 카테고리의 다른 글

[Docker] ClickHouse DB 연동  (0) 2022.04.03
[Docker] Docker 설치하기  (0) 2021.07.22
[Docker] Docker 의 개념  (0) 2021.07.21

댓글