저는 Docker와 Gradle을 아직 처음 사용하고 있지만 Docker 이미지를 빌드하는 Gradle 빌드를 설정하려고합니다.Java 놀이터 용 Gradle 작업
방금 로컬로 배치하고 예상대로 jar를 실행하는 Dockerfile
을 설정했습니다. 내 build.gradle
이 있습니다
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'se.transmode.gradle:gradle-docker:1.2'
}
}
plugins {
id 'com.github.johnrengelman.shadow' version '1.2.3'
}
apply plugin: 'docker'
jar {
manifest {
attributes 'Main-Class': 'com.myapp.Main'
}
}
task buildDocker(type: Docker, dependsOn: shadowJar) {
push = false
applicationName = jar.baseName
tagVersion = 'latest'
dockerfile = file('src/main/docker/Dockerfile')
copy {
from shadowJar
into stageDir
}
}
나는 이미지를 구축 ./gradlew build buildDocker
를 실행합니다. 나는 이것으로 지금까지 행복하다.
일반적으로 실행하고 무시할 수있는 main
메서드를 사용하여 손쉽게 클래스 (예 : Playground.java
)를 만듭니다. 일반적으로 IDE에서이 도구를 실행하지만 지금은 실행중인 다른 Docker 컨테이너에 연결할 수 있기를 원합니다. 닮은 더 우아한 해결책이있을 수 있습니다
은 내가 com.myapp.Main
을 제외하여 내가 사용하고있어 sourceSets
변경을 시도 할 수 알지만, 내가 상상 한이 :
task buildDockerPlayground(type: Docker, dependsOn: shadowJar) {
main = 'com.myapp.Playground'
push = false
applicationName = jar.baseName
tagVersion = 'latest'
dockerfile = file('src/main/docker/Dockerfile')
copy {
from shadowJar
into stageDir
}
}
또 다른 방법은 다른 작업을 할 수 있습니다 그 ./gradlew build buildDocker
으로 전화 할 때 build
을 대신 사용합니다. ./gradlew playground buildDocker
. 더 실용적일까요?
하드 코딩 된 속성을 제거하는 것이 좋습니다. 작업을 통해'main'을 설정하는 방법이 있습니까? 예를 들어'build'를 사용하고'build'를 실행하기 전에'main'을 변경하는'playground' 작업을 정의하는 방법은 무엇입니까? – ordonezalex
또한 docker는 ./gradlew build buildDocker를 두 번 실행할 때까지 앱과 함께 캐시 된'COPY' 레이어를 사용하고 있습니다. '-P' 플래그를 사용할 때도 마찬가지입니다. 나는'buildDocker' 작업에서'inputs' 또는'outputs' 속성을 아직 사용하지 않고 있습니다. Docker가이 변경 사항을 처음으로 감지/반영하지 않는 이유는 무엇입니까? – ordonezalex
과제에서 동일한 것을 달성하는 것을 포함하도록 내 대답을 편집했습니다. 불행히도, 도커 레이어링 문제는이 질문과 지식의 범위를 벗어납니다. 이것은 큰 문제였습니다. –