Skip to content

DockerClient.inspectContainerCmd() fails when Capabilities are not in uppercase #2365

@defung

Description

@defung

Version Information

com.github.docker-java:docker-java-core:3.4.0
com.github.docker-java:docker-java-transport-httpclient5:3.4.0

Docker version:

Client:
 Version:           27.2.0
 API version:       1.47
 Go version:        go1.21.13
 Git commit:        3ab4256
 Built:             Tue Aug 27 14:14:45 2024
 OS/Arch:           darwin/arm64
 Context:           desktop-linux

Server: Docker Desktop 4.34.0 (165256)
 Engine:
  Version:          27.2.0
  API version:      1.47 (minimum version 1.24)
  Go version:       go1.21.13
  Git commit:       3ab5c7d
  Built:            Tue Aug 27 14:15:41 2024
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.7.20
  GitCommit:        8fc6bcff51318944179630522a095cc9dbf9f353
 runc:
  Version:          1.1.13
  GitCommit:        v1.1.13-0-g58aa920
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Steps to reproduce

  1. Create a container with the following command:
    docker run --rm --cap-add net_admin -d nginx
    
  2. Compile and run the following java code:
    import com.github.dockerjava.api.DockerClient;
    import com.github.dockerjava.core.*;
    import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
    import com.github.dockerjava.transport.DockerHttpClient;
    
    import java.net.URI;
    
    public class DockerTest {
      public static void main(String[] args) {
        DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
          .withDockerHost("unix:///var/run/docker.sock")
          .withDockerTlsVerify(false)
          .withApiVersion(RemoteApiVersion.VERSION_1_42)
          .build();
    
        DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
          .dockerHost(URI.create("unix:///var/run/docker.sock"))
          .build();
    
        DockerClient client = DockerClientImpl.getInstance(config, httpClient);
    
        client.inspectContainerCmd("<container_id>").exec();  // replace this with actual container id
      }
    }
    
  3. The following exception is thrown:
    Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.github.dockerjava.api.model.Capability` from String "net_admin": not one of the values accepted for Enum class: [ALL, SYS_BOOT, DAC_OVERRIDE, NET_RAW, BLOCK_SUSPEND, FOWNER, IPC_LOCK, IPC_OWNER, SYS_PACCT, NET_BIND_SERVICE, WAKE_ALARM, FSETID, DAC_READ_SEARCH, SYS_CHROOT, AUDIT_READ, SYS_RAWIO, SYS_ADMIN, KILL, MAC_ADMIN, SYS_RESOURCE, CHOWN, PERFMON, SETPCAP, SYS_PTRACE, NET_ADMIN, SETFCAP, SYS_NICE, LINUX_IMMUTABLE, BPF, AUDIT_CONTROL, LEASE, AUDIT_WRITE, SYS_MODULE, MKNOD, SYSLOG, MAC_OVERRIDE, SYS_TIME, SETGID, SETUID, CHECKPOINT_RESTORE, SYS_TTY_CONFIG, NET_BROADCAST]
    at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: com.github.dockerjava.api.command.InspectContainerResponse["HostConfig"]->com.github.dockerjava.api.model.HostConfig["CapAdd"]->java.lang.Object[][0])
    at com.github.dockerjava.core.DefaultInvocationBuilder.get(DefaultInvocationBuilder.java:77)
    at com.github.dockerjava.core.exec.InspectContainerCmdExec.execute(InspectContainerCmdExec.java:31)
    at com.github.dockerjava.core.exec.InspectContainerCmdExec.execute(InspectContainerCmdExec.java:13)
    at com.github.dockerjava.core.exec.AbstrSyncDockerCmdExec.exec(AbstrSyncDockerCmdExec.java:21)
    at com.github.dockerjava.core.command.AbstrDockerCmd.exec(AbstrDockerCmd.java:33)
    at com.github.dockerjava.core.command.InspectContainerCmdImpl.exec(InspectContainerCmdImpl.java:51)
    at dockerbug.DockerTest.main(DockerTest.java:24)
    
    
  4. Start another container with the following:
    docker run --rm --cap-add NET_ADMIN -d nginx
    
  5. Run the java program again with the new id from step 5, and now it runs without error.
  6. Same issue is seen using --cap-drop net_admin

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions