From 89f7fcbba4565828d04952b4fe8e5c58bdaf48fa Mon Sep 17 00:00:00 2001 From: Eric Schultz Date: Sun, 7 May 2017 15:27:52 -0500 Subject: [PATCH] webGui: allow custom IP addresses for individual Docker containers --- .../DockerContainers.page | 4 +- .../DockerSettings.page | 8 ++- .../include/CreateDocker.php | 63 +++++++++++++++---- .../include/DockerClient.php | 24 +++++-- 4 files changed, 76 insertions(+), 23 deletions(-) diff --git a/plugins/dynamix.docker.manager/DockerContainers.page b/plugins/dynamix.docker.manager/DockerContainers.page index 491275dcb..4bf68a658 100644 --- a/plugins/dynamix.docker.manager/DockerContainers.page +++ b/plugins/dynamix.docker.manager/DockerContainers.page @@ -4,8 +4,8 @@ Cond="(pgrep('dockerd')!==false)" Markdown="false" --- $("#DOCKER_APP_CONFIG_PATH").fileTreeAttach(); diff --git a/plugins/dynamix.docker.manager/include/CreateDocker.php b/plugins/dynamix.docker.manager/include/CreateDocker.php index be2b51695..a4ecf9f52 100644 --- a/plugins/dynamix.docker.manager/include/CreateDocker.php +++ b/plugins/dynamix.docker.manager/include/CreateDocker.php @@ -1,8 +1,6 @@ ".print_r($m, true).""; }; +exec("docker network ls --filter driver='macvlan' --format='{{.Name}}'", $custom); +$subnet = ['bridge'=>'', 'host'=>'', 'none'=>'']; +foreach ($custom as $network) { + $subnets = []; + $values = exec("docker network inspect --format='{{range .IPAM.Config}}{{.Subnet}} {{end}}' $network"); + foreach (explode(' ',$values) as $value) $subnets[] = strpos($value,':')===false ? "IPv4: $value" : "IPv6: $value"; + $subnet[$network] = implode(', ',$subnets); +} + function stopContainer($name) { global $DockerClient; $waitID = mt_rand(); @@ -189,6 +198,7 @@ function postToXML($post, $setOwnership = false) { $xml->Repository = xml_encode(trim($post['contRepository'])); $xml->Registry = xml_encode(trim($post['contRegistry'])); $xml->Network = xml_encode($post['contNetwork']); + $xml->MyIP = xml_encode($post['contMyIP']); $xml->Privileged = (strtolower($post["contPrivileged"]) == 'on') ? 'true' : 'false'; $xml->Support = xml_encode($post['contSupport']); $xml->Overview = xml_encode($post['contOverview']); @@ -251,6 +261,7 @@ function xmlToVar($xml) { $out['Repository'] = xml_decode($xml->Repository); $out['Registry'] = xml_decode($xml->Registry); $out['Network'] = (isset($xml->Network)) ? xml_decode($xml->Network) : xml_decode($xml->Network['Default']); + $out['MyIP'] = isset($xml->MyIP) ? xml_decode($xml->MyIP) : ''; $out['Privileged'] = xml_decode($xml->Privileged); $out['Support'] = xml_decode($xml->Support); $out['Overview'] = stripslashes(xml_decode($xml->Overview)); @@ -362,6 +373,7 @@ function xmlToCommand($xml, $create_paths=false) { $cmdName = (strlen($xml['Name'])) ? '--name="'.$xml['Name'].'"' : ""; $cmdPrivileged = (strtolower($xml['Privileged']) == 'true') ? '--privileged="true"' : ""; $cmdNetwork = '--net="'.strtolower($xml['Network']).'"'; + $cmdMyIP = $xml['MyIP'] ? (strpos($xml['MyIP'],':')===false?'--ip="':'--ip6="').$xml['MyIP'].'"' : ''; $Volumes = ['']; $Ports = ['']; $Variables = ['']; @@ -386,10 +398,10 @@ function xmlToCommand($xml, $create_paths=false) { } } elseif ($confType == 'port') { # Export ports as variable if Network is set to host - if (strtolower($xml['Network']) == 'host') { + if (preg_match('/^(host|eth[0-9]|br[0-9]|bond[0-9])/',strtolower($xml['Network']))) { $Variables[] = strtoupper(sprintf('"%s_PORT_%s"="%s"', $Mode, $containerConfig, $hostConfig)); # Export ports as port if Network is set to bridge - } elseif (strtolower($xml['Network']) == 'bridge') { + } elseif (strtolower($xml['Network'])== 'bridge') { $Ports[] = sprintf("%s:%s/%s", $hostConfig, $containerConfig, $Mode); # No export of ports if Network is set to none } @@ -399,9 +411,10 @@ function xmlToCommand($xml, $create_paths=false) { $Devices[] = '"'.$hostConfig.'"'; } } - $cmd = sprintf('/plugins/dynamix.docker.manager/scripts/docker create %s %s %s %s %s %s %s %s %s', + $cmd = sprintf('/plugins/dynamix.docker.manager/scripts/docker create %s %s %s %s %s %s %s %s %s %s', $cmdName, $cmdNetwork, + $cmdMyIP, $cmdPrivileged, implode(' -e ', $Variables), implode(' -p ', $Ports), @@ -1041,7 +1054,7 @@ $showAdditionalInfo = ''; } else { targetDiv.hide(); } - if (network==0 || network==1) { + if (network==0 || network==1 || network>2) { valueDiv.find('#dt2').text('Host Port:'); valueDiv.show(); } else { @@ -1355,13 +1368,20 @@ $showAdditionalInfo = ''; > Network Type: - + + + + + + + + Fixed IP address (optional): + + >
@@ -1519,6 +1539,20 @@ $showAdditionalInfo = '';