[gradle/docker] Illegal null value provided in this collection: [inspect, --format={{.State.Running}}, null]
gradle에서 docker를 빌드하려고 했는데 이상하게 아래의 에러가 발생했습니다.
C:\Users\ddd\eclipse-workspace\themepark>gradlew assemble docker FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring root project 'themepark'. > Illegal null value provided in this collection: [inspect, --format={{.State.Running}}, null] * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 4s |
구글링 해도 정보가 별로 없네요;;
C:\Users\ddd\eclipse-workspace\themepark>gradlew assemble docker --scan
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring root project 'themepark'.
> Illegal null value provided in this collection: [inspect, --format={{.State.Running}}, null]
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 12s
Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes
Gradle Terms of Service accepted.
Publishing build scan...
https://gradle.com/s/uvoxbjndfdfru
--scan 옵션을 주면 제일 마지막에 링크가 하나 나옵니다. 여기로 접속해봅시다.
제가 캡쳐를 일부 못했는데 링크 가면 보이는 입력창에 자신의 이메일 주소를 입력하면 위의 화면이 나옵니다.
방금 도착한 메일을 누르면 위의 내용이 나오는데 this link를 클릭 해주세요.
그러면 방금 한 Gradle 빌드에 대해.. 정보를 좀 더 편리하게 볼 수 있습니다! 우와~
Failure 1 of 1A problem occurred configuring root project 'themepark'.
Illegal null value provided in this collection: [inspect, --format={{.State.Running}}, null]
Exception
org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'themepark'.
at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:75)
•••
Caused by: java.lang.IllegalArgumentException: Illegal null value provided in this collection: [inspect, --format={{.State.Running}}, null]
at org.gradle.util.GUtil.addToCollection(GUtil.java:162)
•••
at com.palantir.gradle.docker.DockerRunPlugin$_apply_closure6$_closure7.doCall(DockerRunPlugin.groovy:62)
•••
at com.palantir.gradle.docker.DockerRunPlugin$_apply_closure6.doCall(DockerRunPlugin.groovy:60)
•••
Failure에서 문제가 발생한 위치를 보겠습니다.
Caused by: java.lang.IllegalArgumentException: Illegal null value provided in this collection: [inspect, --format={{.State.Running}}, null]
at org.gradle.util.GUtil.addToCollection(GUtil.java:162)
at org.gradle.process.internal.ProcessArgumentsSpec.args(ProcessArgumentsSpec.java:88)
at org.gradle.process.internal.ProcessArgumentsSpec.setArgs(ProcessArgumentsSpec.java:100)
at org.gradle.process.internal.ProcessArgumentsSpec.commandLine(ProcessArgumentsSpec.java:61)
at org.gradle.process.internal.ProcessArgumentsSpec.commandLine(ProcessArgumentsSpec.java:54)
at org.gradle.process.internal.DefaultExecSpec.commandLine(DefaultExecSpec.java:71)
at org.gradle.api.tasks.AbstractExecTask.commandLine(AbstractExecTask.java:78)
at org.gradle.api.tasks.AbstractExecTask.commandLine(AbstractExecTask.java:44)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at com.palantir.gradle.docker.DockerRunPlugin$_apply_closure6$_closure7.doCall(DockerRunPlugin.groovy:62)
github에서 제가 사용하는 gradle 버전인 6.7.1로 태그 맞추고.. 에러를 발생시키는 코드를 찾아갔습니다.
public static <V, T extends Collection<? super V>> T addToCollection(T dest, boolean failOnNull, Iterable<? extends V> src) {
for (V v : src) {
if (failOnNull && v == null) {
throw new IllegalArgumentException("Illegal null value provided in this collection: " + src);
}
dest.add(v);
}
return dest;
}
흠.. 잘은 모르겠지만 Iterable인 src 중 하나가.. null이면 안되는데 null이라 문제가 발생하는 것 같네요.
혹은.. failOnNull이 false로 되면 될 것 같기도 합니다.
그 전에 caller를 찾아보면 github.com/gradle/gradle/blob/v6.7.1/subprojects/core/src/main/java/org/gradle/process/internal/ProcessArgumentsSpec.java에 있습니다.
public ProcessArgumentsSpec args(Iterable<?> args) {
GUtil.addToCollection(arguments, true, args);
return this;
}
계속 전 caller를 찾아보겠습니다.
public ProcessArgumentsSpec setArgs(Iterable<?> arguments) {
this.arguments.clear();
args(arguments);
return this;
}
public ProcessArgumentsSpec commandLine(Iterable<?> args) {
List<Object> argsList = Lists.newArrayList(args);
hasExecutable.setExecutable(argsList.get(0));
setArgs(argsList.subList(1, argsList.size()));
return this;
}
public ProcessArgumentsSpec commandLine(Object... arguments) {
commandLine(Arrays.asList(arguments));
return this;
}
@Override
public ExecSpec commandLine(Object... arguments) {
argumentsSpec.commandLine(arguments);
return this;
}
흠.. 여기서 말하는 commandLine이 뭔지 알면 도움이 될텐데요 ㅎㅎ
콜 스택을 보니 팔란티어 쪽 코드에 caller였습니다.
at com.palantir.gradle.docker.DockerRunPlugin$_apply_closure6$_closure7.doCall(DockerRunPlugin.groovy:62)
그런데 DockerRunPlugin 이네요?
저는 docker{}만 정의하고 dockerRun{}은 정의하지 않은 상태입니다.
혹시나 해서.. build.gradle에 dockerRun{}을 추가하니 빌드가 제대로 되네요.
gradle 버전 6.7.1의 문제같은데 gradlew assemble docker만 수행해도.. dockerRun{}이 있는지 체크하고 없으면 에러를 발생시키는 것 같습니다.
문제가 발생했던 부분의 코드가 gradle 버전 6.6.0부터 변경이 좀 있었던 것 같네요.
그래들 공식 홈에서 6.5.1 버전을 다운받아서 환경변수만 갱신하고 테스트 했더니.. 여전히 dockerRun{}이 없으면 빌드가 되질 않았습니다. 그래서.. 이클립스에서 아래의 파일도 함께 수정해봤습니다.
project_root/gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
로컬에 다운받은 gradle뿐만 아니라.. 위의 파일에 명시된 gradle도 영향을 미치네요.
(시스템 변수에 영향을 받는게 아니라.. 바로 위의 gradle-wrapper.properties 설정에만 영향을 받는 것 같네요?)
결론: 6.5.1버전의 경우 dockerRun{}이 없어도 빌드가 잘 됩니다.. ㅎㅎㅎ;;
혹은 최신 버전 Gradle을 사용하는 경우 dockerRun{}을 추가하면 됩니다.
댓글 영역