gesellix/docker-client

working with the DockerRunTask

trogdor259 opened this issue · 4 comments

When I have a simple 'echo' command in my execInContainer task, I get a null response. Here is the debug:

10:34:34.184 [INFO] [de.gesellix.docker.client.DockerClientImpl] docker start exec 'db91e0a4c9eec744f26c9185e638ba0347b7cdfccc26842888ebf87316544e6a'
10:34:34.185 [INFO] [de.gesellix.docker.client.DockerClientImpl] docker inspect exec 'db91e0a4c9eec744f26c9185e638ba0347b7cdfccc26842888ebf87316544e6a'
10:34:34.188 [DEBUG] [de.gesellix.docker.client.OkDockerClient] GET http://2f7661722f72756e2f646f636b65722e736f636b.socket/exec/db91e0a4c9eec744f26c9185e638ba0347b7cdfccc26842888ebf87316544e6a/json using proxy: DIRECT
10:34:34.189 [DEBUG] [de.gesellix.docker.client.filesocket.UnixSocket] connect via '/var/run/docker.sock'...
10:34:34.190 [DEBUG] [de.gesellix.docker.client.OkDockerClient] response: Response{protocol=http/1.1, code=200, message=OK, url=http://2f7661722f72756e2f646f636b65722e736f636b.socket/exec/db91e0a4c9eec744f26c9185e638ba0347b7cdfccc26842888ebf87316544e6a/json}
10:34:34.190 [DEBUG] [de.gesellix.docker.client.OkDockerClient] status: [text:OK, code:200, success:true]
10:34:34.190 [DEBUG] [de.gesellix.docker.client.OkDockerClient] headers: 
Content-Type: application/json
Server: Docker/1.12.0 (linux)
Date: Fri, 12 Aug 2016 16:34:34 GMT
Content-Length: 382

10:34:34.194 [DEBUG] [de.gesellix.docker.client.OkDockerClient] POST http://2f7661722f72756e2f646f636b65722e736f636b.socket/exec/db91e0a4c9eec744f26c9185e638ba0347b7cdfccc26842888ebf87316544e6a/start using proxy: DIRECT
10:34:34.195 [DEBUG] [de.gesellix.docker.client.filesocket.UnixSocket] connect via '/var/run/docker.sock'...
10:34:34.198 [DEBUG] [de.gesellix.docker.client.OkDockerClient] response: Response{protocol=http/1.1, code=200, message=OK, url=http://2f7661722f72756e2f646f636b65722e736f636b.socket/exec/db91e0a4c9eec744f26c9185e638ba0347b7cdfccc26842888ebf87316544e6a/start}
10:34:34.198 [DEBUG] [de.gesellix.docker.client.OkDockerClient] status: [text:OK, code:200, success:true]
10:34:34.198 [DEBUG] [de.gesellix.docker.client.OkDockerClient] headers: 
Content-Type: application/vnd.docker.raw-stream

10:34:34.218 [INFO] [org.gradle.api.Task] de.gesellix.docker.client.DockerResponse(status:[text:OK, code:200, success:true], headers:Content-Type: application/vnd.docker.raw-stream
, contentType:application/vnd.docker.raw-stream, mimeType:application/vnd.docker.raw-stream, contentLength:-1, stream:de.gesellix.docker.client.rawstream.RawInputStream@39da5e49, content:null)
10:34:34.218 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':execInContainer'

My gradle task looks like this:

plugins {
  id "de.gesellix.docker" version "2016-07-24T01-05-06"
}

import de.gesellix.gradle.docker.tasks.*
import java.util.logging.Logger

task rmImage(type: DockerRmiTask) {
  imageId = "atom"
}

task buildImage(type: DockerBuildTask) {
  dependsOn rmImage
  imageName = "atom"
  buildContextDirectory = file(".")
}

task stopContainer(type: DockerStopTask) {
  dependsOn buildImage
  containerId = "atom"
}

task rmContainer(type: DockerRmTask) {
  dependsOn stopContainer
  containerId = "atom"
}

task runContainer(type: DockerRunTask) {
  dependsOn rmContainer
  imageName = "atom"
  containerName = "atom"
}

task execInContainer(type: DockerExecTask) {
  dependsOn runContainer

  containerId = "atom"
  commandLine = 'echo "it works!"'

  doLast {
    logger.info("$result")
  }
}

Am I missing something? I can't figure out why it fails to even return the simple echo command.

Please have a look at the last but one log entry:

10:34:34.218 [INFO] [org.gradle.api.Task] de.gesellix.docker.client.DockerResponse(status:[text:OK, code:200, success:true], headers:Content-Type: application/vnd.docker.raw-stream
, contentType:application/vnd.docker.raw-stream, mimeType:application/vnd.docker.raw-stream, contentLength:-1, stream:de.gesellix.docker.client.rawstream.RawInputStream@39da5e49, content:null)

It dumps the wrapped response from the exec command, along with some http response details. The response body is returned as stream (hence the Content-Type: application/vnd.docker.raw-stream), so you need to consume the result.stream property.

Instead of:

doLast {
    logger.info("$result")
}

you can write:

doLast {
    logger.info("${de.gesellix.docker.client.util.IOUtils.copy(result.stream, System.out)}")
}

Does that help?

Hi there, that helped and got my task to log a simple echo "hello world" to work. I am, however, running into another similar issue using the DockerRunTask utility. I have a Dockerfile that I am using to build am image and the using that image to do a docker run using the DockerRunTask. In the Dockerfile I have specified an ENTRYPOINT that runs a robot framework task. Running the docker build and docker run commands via command line without using gradle work fine, however, that is not an option for what I am trying to accomplish.
When I create the DockerRunTask to execute the run with the entrypoint the build succeeds every time. It seems that the robot command is not actually executing and I can never even see an error message. Using the --info tag in Gradle, this is what I see:

Executing task ':dockerRun' (up-to-date check took 0.0 secs) due to:
  Task has not declared any outputs.
docker run
docker run
docker create
using docker at 'unix:///var/run/docker.sock'
docker start
[container:de.gesellix.docker.client.DockerResponse(status:[text:Created, code:201, success:true], headers:Content-Type: application/json
Server: Docker/1.12.0 (linux)
Date: Wed, 17 Aug 2016 22:15:45 GMT
Content-Length: 90
, contentType:application/json, mimeType:application/json, contentLength:90, stream:null, content:[Id:f3280c47c849a649a9b94671a29c8e5b5ee5af64dfa2c0094b0b52a30c95704c, Warnings:null]), status:de.gesellix.docker.client.DockerResponse(status:[text:No Content, code:204, success:true], headers:Server: Docker/1.12.0 (linux)
Date: Wed, 17 Aug 2016 22:15:45 GMT
, contentType:null, mimeType:null, contentLength:-1, stream:buffer(okhttp3.internal.http.Http1xStream$FixedLengthSource@3ade4a60).inputStream(), content:null)]
:dockerRun (Thread[Daemon worker Thread 2,5,main]) completed. Took 0.272 secs.

The debug shows this:

16:29:21.349 [INFO] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Executing task ':dockerRun' (up-to-date check took 0.0 secs) due to:
  Task has not declared any outputs.
16:29:21.349 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':dockerRun'.
16:29:21.349 [INFO] [org.gradle.api.Task] docker run
16:29:21.349 [INFO] [de.gesellix.docker.client.DockerClientImpl] docker run
16:29:21.349 [INFO] [de.gesellix.docker.client.DockerClientImpl] docker create
16:29:21.349 [DEBUG] [de.gesellix.docker.client.config.DockerClientConfig] is 'unix'
16:29:21.350 [DEBUG] [de.gesellix.docker.client.config.DockerClientConfig] selected dockerHost at '[protocol:unix, host:/var/run/docker.sock, port:-1, certPath:null]'
16:29:21.350 [INFO] [de.gesellix.docker.client.DockerClientImpl] using docker at 'unix:///var/run/docker.sock'
16:29:21.352 [DEBUG] [de.gesellix.docker.client.OkDockerClient] POST http://2f7661722f72756e2f646f636b65722e736f636b.socket/containers/create?name=vision using proxy: DIRECT
16:29:21.353 [DEBUG] [de.gesellix.docker.client.filesocket.UnixSocket] connect via '/var/run/docker.sock'...
16:29:21.440 [DEBUG] [de.gesellix.docker.client.OkDockerClient] response: Response{protocol=http/1.1, code=201, message=Created, url=http://2f7661722f72756e2f646f636b65722e736f636b.socket/containers/create?name=vision}
16:29:21.440 [DEBUG] [de.gesellix.docker.client.OkDockerClient] status: [text:Created, code:201, success:true]
16:29:21.440 [DEBUG] [de.gesellix.docker.client.OkDockerClient] headers: 
Content-Type: application/json
Server: Docker/1.12.0 (linux)
Date: Wed, 17 Aug 2016 22:29:21 GMT
Content-Length: 90

16:29:21.441 [INFO] [de.gesellix.docker.client.DockerClientImpl] docker start
16:29:21.444 [DEBUG] [de.gesellix.docker.client.OkDockerClient] POST http://2f7661722f72756e2f646f636b65722e736f636b.socket/containers/540905bd8f455126a8213d0d0ba4b25c57c24a47940c1078005dd2e3e7ff356d/start using proxy: DIRECT
16:29:21.445 [DEBUG] [de.gesellix.docker.client.filesocket.UnixSocket] connect via '/var/run/docker.sock'...
16:29:21.619 [DEBUG] [de.gesellix.docker.client.OkDockerClient] response: Response{protocol=http/1.1, code=204, message=No Content, url=http://2f7661722f72756e2f646f636b65722e736f636b.socket/containers/540905bd8f455126a8213d0d0ba4b25c57c24a47940c1078005dd2e3e7ff356d/start}
16:29:21.619 [DEBUG] [de.gesellix.docker.client.OkDockerClient] status: [text:No Content, code:204, success:true]
16:29:21.620 [DEBUG] [de.gesellix.docker.client.OkDockerClient] headers: 
Server: Docker/1.12.0 (linux)
Date: Wed, 17 Aug 2016 22:29:21 GMT

16:29:21.620 [INFO] [org.gradle.api.Task] [container:de.gesellix.docker.client.DockerResponse(status:[text:Created, code:201, success:true], headers:Content-Type: application/json
Server: Docker/1.12.0 (linux)
Date: Wed, 17 Aug 2016 22:29:21 GMT
Content-Length: 90
, contentType:application/json, mimeType:application/json, contentLength:90, stream:null, content:[Id:540905bd8f455126a8213d0d0ba4b25c57c24a47940c1078005dd2e3e7ff356d, Warnings:null]), status:de.gesellix.docker.client.DockerResponse(status:[text:No Content, code:204, success:true], headers:Server: Docker/1.12.0 (linux)
Date: Wed, 17 Aug 2016 22:29:21 GMT
, contentType:null, mimeType:null, contentLength:-1, stream:buffer(okhttp3.internal.http.Http1xStream$FixedLengthSource@422ab53c).inputStream(), content:null)]
16:29:21.621 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':dockerRun'
16:29:21.621 [INFO] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] :dockerRun (Thread[Daemon worker Thread 4,5,main]) completed. Took 0.273 secs.
16:29:21.621 [DEBUG] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] Task worker [Thread[Daemon worker Thread 4,5,main]] finished, busy: 9.692 secs, idle: 0.001 secs

This is my code:

task dockerRun(type: DockerRunTask) {
  dependsOn rmContainer
  imageName = "vision"
  containerName = "vision"
  containerConfiguration = [
    "Cmd"       : ["-v env:alpha -i level0 Email-Factory/v1/templateTests.robot"],
    "HostConfig": [
      "Binds": ["${volumeDir}:/results"]
    ]
  ]

  doLast {
    logger.info("${result}")
  }
}

When I run this using docker it works (docker run -v /results:/results vision -v env:alpha -i level0 Email-Factory/v1/templateTests.robot). Am I missing something obvious? I am new to gradle and docker, so I am still learning.

@trogdor259 can you share the Dockerfile? The most important aspect is the CMD or the ENTRYPOINT, but maybe other details (like the FROM statement) may be important, too.
The logs look ok, but you should again consume the stream, like shown in my last comment.

closing due to missing response. feel free to leave an answer nevertheless.