getDockerContainers(); if (!$all_containers) { echo "No Docker containers installed"; return; } // Read network settings extract(parse_ini_file('state/network.ini',true)); // Read container info $all = $DockerTemplates->getAllInfo(); $menu = []; $docker = ['var docker=[];']; foreach ($all_containers as $ct) { $name = $ct['Name']; $info = &$all[$name]; $mode = $ct['NetworkMode']; $id = $ct['Id']; $imageID = $ct['ImageId']; $is_autostart = $info['autostart'] ? 'true':'false'; $updateStatus = $info['updated']=='true'||$info['updated']=='undef' ? 'true':'false'; $running = $ct['Running'] ? 'true':'false'; $template = $info['template']; $webGui = html_entity_decode($info['url']); $support = html_entity_decode($info['Support']); $project = html_entity_decode($info['Project']); $menu[] = sprintf("addDockerContainerContext('%s','%s','%s',%s,%s,%s,'%s','%s','%s','%s');",addslashes($name),addslashes($imageID),addslashes($template),$running,$updateStatus,$is_autostart,addslashes($webGui),$id,addslashes($support),addslashes($project)); $docker[] = "docker.push({name:'$name',id:'$id',state:'$running',update:'$updateStatus'});"; $shape = $ct['Running'] ? 'play':'square'; $status = $ct['Running'] ? 'started':'stopped'; $icon = $info['icon'] ?: '/plugins/dynamix.docker.manager/images/question.png'; $ports = []; if ($mode=='bridge') { $binds = explode('|',exec("docker inspect --format='{{range \$p,\$c := .HostConfig.PortBindings}}{{\$p}}:{{(index \$c 0).HostPort}}|{{end}}' $name 2>/dev/null")); $ip = exec("docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name 2>/dev/null"); foreach ($binds as $bind) { if (!$bind) continue; list($container_port,$host_port) = explode(':',$bind); $ports[] = sprintf('%s:%s%s:%s',$ip, $container_port, $eth0['IPADDR:0'], $host_port); } } else { $binds = explode('|',exec("docker inspect --format='{{range \$p,\$c := .Config.ExposedPorts}}{{\$p}}|{{end}}' $name 2>/dev/null")); $ip = exec("docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name 2>/dev/null") ?: $eth0['IPADDR:0']; foreach ($binds as $bind) { if (!$bind) continue; $ports[] = sprintf('%s:%s%s:%s',$ip, $bind, $ip, str_replace(['/tcp','/udp'],'',$bind)); } } $paths = []; $mounts = explode('|',exec("docker inspect --format='{{range \$c := .HostConfig.Binds}}{{\$c}}|{{end}}' $name 2>/dev/null")); foreach ($mounts as $mount) { if (!$mount) continue; list($host_path,$container_path,$access_mode) = explode(':',$mount); $paths[] = sprintf('%s%s', htmlspecialchars($container_path), $access_mode=='ro'?'long-arrow-left':'arrows-h', htmlspecialchars($host_path)); } echo ""; echo "
"; echo ""; echo "
"; echo ""; if ($template) { echo "".htmlspecialchars($name).""; } else { echo htmlspecialchars($name); } echo "
Container ID: ".htmlspecialchars($id)."
"; if ($ct['BaseImage']) echo "
".htmlspecialchars(${ct['BaseImage']})."
"; echo "
By:"; $registry = $info['registry']; if ($registry) { echo "".htmlspecialchars($ct['Image']).""; } else { echo htmlspecialchars($ct['Image']); } echo "
"; if ($updateStatus=='false') { echo " update ready"; } elseif ($updateStatus=='true') { echo " up-to-date"; echo "
force update
"; } else { echo " not available"; echo "
force update
"; } echo "$mode"; echo "".implode('
',$ports)."
"; echo "".implode('
',$paths)."
"; echo ""; echo "
".htmlspecialchars(str_replace('Up','Uptime',$ct['Status']))."
Created ".htmlspecialchars($ct['Created'])."
"; } foreach ($DockerClient->getDockerImages() as $image) { if (count($image['usedBy'])) continue; $menu[] = sprintf("addDockerImageContext('%s','%s');",$image['Id'],implode(', ',$image['Tags'])); echo ""; echo "
"; echo "
"; echo ""; echo "
"; echo "(orphan image)
Image ID: ".htmlspecialchars($image['Id'])."
"; if (strpos(implode($image['Tags']),"<none>:<none>")===false) echo "
".implode('
',array_map('htmlspecialchars',$image['Tags']))."
"; echo "    "; echo "
Created ".htmlspecialchars($image['Created'])."
"; } echo "\0".implode($menu).implode($docker); ?>