micronaut-projects / micronaut-gradle-plugin

A Gradle Plugin for Micronaut
Apache License 2.0
65 stars 43 forks source link

dockerBuild gradle task fails with Status 400: {"message":"dockerfile parse error line 3: Unknown flag: link"} #970

Closed revsmadap closed 3 months ago

revsmadap commented 3 months ago

Expected Behavior

No response

Actual Behaviour

Hi,

I have create a simple hello world application. Trying to dockerize it using dockerBuild gradle task. But fails with

Status 400: {"message":"dockerfile parse error line 3: Unknown flag: link"}

Stacktrace:

> org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':dockerBuild'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:148)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:146)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:134)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: com.github.dockerjava.api.exception.BadRequestException: Status 400: {"message":"dockerfile parse error line 3: Unknown flag: link"}
        at com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:237)
        at com.github.dockerjava.core.DefaultInvocationBuilder.lambda$executeAndStream$1(DefaultInvocationBuilder.java:269)

Dockerfile (generated):

FROM oracle/graalvm-ce:22.2.0-java11
WORKDIR /home/app
COPY --link layers/libs /home/app/libs
COPY --link layers/app /home/app/
COPY --link layers/resources /home/app/resources
EXPOSE 9000
ENTRYPOINT ["java -Duser.timezone=GMT -Djava.security.egd=file:/dev/./urandom -jar /home/app/application.jar"]

Steps To Reproduce

Following are the step

  1. Create a basic Micronaut application with Gradle
  2. HelloWorldRestController with /sayHello context path
  3. run ./gradlew clean dockerBuild

Environment Information

Machine Details Apple M1 Pro Version 14.3.1 (23D60)

Java Info JAVA_VERSION=17.0.7, JAVA_VENDOR=Oracle Corporation, RUNTIME_NAME=Java(TM) SE Runtime Environment, RUNTIME_VERSION=17.0.7+8-LTS-224, VM_NAME=Java HotSpot(TM) 64-Bit Server VM, VM_VERSION=17.0.7+8-LTS-224, VM_VENDOR=Oracle Corporation, OS_ARCH=aarch64

Docker Info: `Client: Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc., v0.8.2) compose: Docker Compose (Docker Inc., v2.5.1)

Server: Containers: 54 Running: 0 Paused: 0 Stopped: 54 Images: 162 Server Version: 20.10.16 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc Default Runtime: runc Init Binary: docker-init containerd version: 3df54a852345ae127d1fa3092b95168e4a88e2f8 runc version: init version: Security Options: seccomp Profile: default Kernel Version: 5.15.40-0-virt Operating System: Alpine Linux v3.15 OSType: linux Architecture: aarch64 CPUs: 4 Total Memory: 9.704GiB Name: lima-rancher-desktop ID: PLGR:LDZG:NHVJ:7Z6B:NAWQ:3REN:NYUV:3HMW:N3ZS:4HA7:XAJO:OFNY Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false`

Example Application

No response

Version

4.3.4

revsmadap commented 3 months ago

I see same issue on Linux machine.

altro3 commented 3 months ago

@revsmadap read this, pls: https://stackoverflow.com/questions/74559925/dockerfile-parse-error-line-63-unknown-flag-link

altro3 commented 3 months ago

I mean, that I think. the problem not in micronaut gradle plugin or dockerfile format.

melix commented 3 months ago

This can happen on older Docker versions which do not support the --link flag. An easy workaround is to use:

tasks.withType(io.micronaut.gradle.docker.MicronautDockerfile).configureEach { useCopyLink = false }
tasks.withType(io.micronaut.gradle.docker.NativeImageDockerfile).configureEach { useCopyLink = false }
revsmadap commented 3 months ago

I mean, that I think. the problem not in micronaut gradle plugin or dockerfile format.

Thank you @altro3. I understand that. I read the above stack overflow thread. As the Dockerfile is auto generate, could not enabled or set # syntax=docker/dockerfile:1.4. or export BUILD_KIT=1.

I have tried seeing the source code, but could not place to set these options.

revsmadap commented 3 months ago

This can happen on older Docker versions which do not support the --link flag. An easy workaround is to use:

tasks.withType(io.micronaut.gradle.docker.MicronautDockerfile).configureEach { useCopyLink = false }
tasks.withType(io.micronaut.gradle.docker.NativeImageDockerfile).configureEach { useCopyLink = false }

Thank you @melix. Will try these options.

revsmadap commented 3 months ago

Thanks @melix. It works.

I have following queries

  1. How can I change the image name? I tried the following, I have defined dockerRegistryName, imageName in the build.gradle
tasks.named("dockerBuild"){
    imageName = "${dockerRegistryName}/${imageName}:${dockerVersion}"
    //name = "${dockerRegistryName}/${imageName}:${dockerVersion}"
}
  1. Any sample to set the args in the docker file. I have tried the following, but it doesn't work.
    tasks.named("dockerfile") {
    args("ARGS JAR_FILE")
    //  args = ["ARGS JAR_FILE"]
    }
revsmadap commented 3 months ago

Thanks @melix. It works.

I have following queries

  1. How can I change the image name? I tried the following, I have defined dockerRegistryName, imageName in the build.gradle
tasks.named("dockerBuild"){
    imageName = "${dockerRegistryName}/${imageName}:${dockerVersion}"
    //name = "${dockerRegistryName}/${imageName}:${dockerVersion}"
}

I'm able to solve this issue.