You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/11/09 11:57:15 UTC

[camel] branch main updated: CAMEL-18679: camel-docker - Bind mount support (#8697)

This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 54abe302b40 CAMEL-18679: camel-docker - Bind mount support (#8697)
54abe302b40 is described below

commit 54abe302b40c9d97cac95802bba63b615c9fa9bf
Author: Nicolas Filotto <es...@users.noreply.github.com>
AuthorDate: Wed Nov 9 12:57:08 2022 +0100

    CAMEL-18679: camel-docker - Bind mount support (#8697)
    
    ## Motivation
    
    Up to now, there is no way to bind mount a volume.
    
    ## Modifications
    
    * Use the `DOCKER_BINDS` constant for the operation `containercreate` to specify the binds to apply
    * Update the unit test for the  operation `containercreate` to ensure that the changes are properly applied
    * Fix violations in `CreateContainerCmdHeaderTest`
    
    ## Result
    
    It is now possible to bind mount a volume as follows:
    
    ```
    .setHeader(DockerConstants.DOCKER_BINDS, constant(Bind.parse("/some/host/directory/:/some/guest/directory:ro")))
    .to("docker:containercreate")
    ```
---
 .../resources/org/apache/camel/component/docker/docker.json |  1 +
 .../org/apache/camel/component/docker/DockerConstants.java  |  3 ++-
 .../camel/component/docker/producer/DockerProducer.java     |  7 +++++++
 .../docker/headers/CreateContainerCmdHeaderTest.java        | 13 ++++++++-----
 4 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/components/camel-docker/src/generated/resources/org/apache/camel/component/docker/docker.json b/components/camel-docker/src/generated/resources/org/apache/camel/component/docker/docker.json
index d68855f1ac0..3d9d8497d18 100644
--- a/components/camel-docker/src/generated/resources/org/apache/camel/component/docker/docker.json
+++ b/components/camel-docker/src/generated/resources/org/apache/camel/component/docker/docker.json
@@ -121,6 +121,7 @@
     "CamelDockerStdInOpen": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "With StdIn in open flag", "constantName": "org.apache.camel.component.docker.DockerConstants#DOCKER_STD_IN_OPEN" },
     "CamelDockerVolumesFrom": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "VolumesFrom or VolumesFrom[]", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "With volumes from", "constantName": "org.apache.camel.component.docker.DockerConstants#DOCKER_VOLUMES_FROM" },
     "CamelDockerDomainName": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "With domain name", "constantName": "org.apache.camel.component.docker.DockerConstants#DOCKER_DOMAIN_NAME" },
+    "CamelDockerBinds": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Bind or Bind[]", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "With binds", "constantName": "org.apache.camel.component.docker.DockerConstants#DOCKER_BINDS" },
     "CamelDockerCapAdd": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Capability or Capability[]", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "With cap add", "constantName": "org.apache.camel.component.docker.DockerConstants#DOCKER_CAP_ADD" },
     "CamelDockerCapDrop": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Capability or Capability[]", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "With cap drop", "constantName": "org.apache.camel.component.docker.DockerConstants#DOCKER_CAP_DROP" },
     "CamelDockerNetwork": { "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The network name", "constantName": "org.apache.camel.component.docker.DockerConstants#DOCKER_NETWORK" },
diff --git a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java
index f87965755a1..88145836f2b 100644
--- a/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java
+++ b/components/camel-docker/src/main/java/org/apache/camel/component/docker/DockerConstants.java
@@ -280,11 +280,12 @@ public final class DockerConstants {
     public static final String DOCKER_VOLUMES_FROM = "CamelDockerVolumesFrom";
     @Metadata(description = "With domain name", javaType = "String")
     public static final String DOCKER_DOMAIN_NAME = "CamelDockerDomainName";
+    @Metadata(description = "With binds", javaType = "Bind or Bind[]")
+    public static final String DOCKER_BINDS = "CamelDockerBinds";
 
     /**
      * Start Container *
      */
-    public static final String DOCKER_BINDS = "CamelDockerBinds";
     @Metadata(description = "With cap add", javaType = "Capability or Capability[]")
     public static final String DOCKER_CAP_ADD = "CamelDockerCapAdd";
     @Metadata(description = "With cap drop", javaType = "Capability or Capability[]")
diff --git a/components/camel-docker/src/main/java/org/apache/camel/component/docker/producer/DockerProducer.java b/components/camel-docker/src/main/java/org/apache/camel/component/docker/producer/DockerProducer.java
index ef36915d993..ff6ce16ec01 100644
--- a/components/camel-docker/src/main/java/org/apache/camel/component/docker/producer/DockerProducer.java
+++ b/components/camel-docker/src/main/java/org/apache/camel/component/docker/producer/DockerProducer.java
@@ -49,6 +49,7 @@ import com.github.dockerjava.api.command.TopContainerCmd;
 import com.github.dockerjava.api.command.UnpauseContainerCmd;
 import com.github.dockerjava.api.command.VersionCmd;
 import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.Bind;
 import com.github.dockerjava.api.model.Capability;
 import com.github.dockerjava.api.model.ExposedPort;
 import com.github.dockerjava.api.model.ExposedPorts;
@@ -845,6 +846,12 @@ public class DockerProducer extends DefaultProducer {
             createContainerCmd.withVolumes(volume);
         }
 
+        Bind[] binds = DockerHelper.getArrayProperty(DockerConstants.DOCKER_BINDS, message, Bind.class);
+
+        if (binds != null) {
+            createContainerCmd.getHostConfig().withBinds(binds);
+        }
+
         VolumesFrom[] volumesFrom
                 = DockerHelper.getArrayProperty(DockerConstants.DOCKER_VOLUMES_FROM, message, VolumesFrom.class);
 
diff --git a/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/CreateContainerCmdHeaderTest.java b/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/CreateContainerCmdHeaderTest.java
index c6ee1de63cc..07b08d707eb 100644
--- a/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/CreateContainerCmdHeaderTest.java
+++ b/components/camel-docker/src/test/java/org/apache/camel/component/docker/headers/CreateContainerCmdHeaderTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.docker.headers;
 import java.util.Map;
 
 import com.github.dockerjava.api.command.CreateContainerCmd;
+import com.github.dockerjava.api.model.Bind;
 import com.github.dockerjava.api.model.Capability;
 import com.github.dockerjava.api.model.ExposedPort;
 import com.github.dockerjava.api.model.HostConfig;
@@ -31,12 +32,11 @@ import org.mockito.Mock;
 import org.mockito.Mockito;
 
 import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
 
 /**
  * Validates Create Container Request headers are parsed properly
  */
-public class CreateContainerCmdHeaderTest extends BaseDockerHeaderTest<CreateContainerCmd> {
+class CreateContainerCmdHeaderTest extends BaseDockerHeaderTest<CreateContainerCmd> {
 
     @Mock
     private CreateContainerCmd mockObject;
@@ -73,6 +73,7 @@ public class CreateContainerCmdHeaderTest extends BaseDockerHeaderTest<CreateCon
         String[] entrypoint = new String[] { "sleep", "9999" };
         String portSpecs = "80";
         String dns = "8.8.8.8";
+        Bind bind = Bind.parse("/Users/foo/apps/:/apps:ro");
 
         Map<String, Object> headers = getDefaultParameters();
         headers.put(DockerConstants.DOCKER_IMAGE, image);
@@ -102,15 +103,16 @@ public class CreateContainerCmdHeaderTest extends BaseDockerHeaderTest<CreateCon
         headers.put(DockerConstants.DOCKER_PORT_SPECS, portSpecs);
         headers.put(DockerConstants.DOCKER_DNS, dns);
         headers.put(DockerConstants.DOCKER_DOMAIN_NAME, domainName);
+        headers.put(DockerConstants.DOCKER_BINDS, bind);
 
         Mockito.when(mockObject.getHostConfig()).thenReturn(hostConfig);
 
         template.sendBodyAndHeaders("direct:in", "", headers);
 
         Mockito.verify(dockerClient, Mockito.times(1)).createContainerCmd(image);
-        Mockito.verify(mockObject, Mockito.times(1)).withExposedPorts(eq(exposedPort));
-        Mockito.verify(mockObject, Mockito.times(1)).withTty(eq(tty));
-        Mockito.verify(mockObject, Mockito.times(1)).withName(eq(name));
+        Mockito.verify(mockObject, Mockito.times(1)).withExposedPorts(exposedPort);
+        Mockito.verify(mockObject, Mockito.times(1)).withTty(tty);
+        Mockito.verify(mockObject, Mockito.times(1)).withName(name);
         Mockito.verify(mockObject, Mockito.times(1)).withWorkingDir(workingDir);
         Mockito.verify(mockObject, Mockito.times(1)).withNetworkDisabled(disableNetwork);
         Mockito.verify(mockObject, Mockito.times(1)).withHostName(hostname);
@@ -129,6 +131,7 @@ public class CreateContainerCmdHeaderTest extends BaseDockerHeaderTest<CreateCon
         Mockito.verify(mockObject, Mockito.times(1)).withDomainName(domainName);
 
         Mockito.verify(hostConfig, Mockito.times(1)).withVolumesFrom(volumesFromContainer);
+        Mockito.verify(hostConfig, Mockito.times(1)).withBinds(bind);
         Mockito.verify(hostConfig, Mockito.times(1)).withCapAdd(capAdd);
         Mockito.verify(hostConfig, Mockito.times(1)).withCapDrop(capDrop);
         Mockito.verify(hostConfig, Mockito.times(1)).withDns(dns);