$docroot = $docroot ?? $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
// Add the Docker JSON client
require_once "$docroot/plugins/dynamix.docker.manager/include/DockerClient.php";
$user_prefs = $dockerManPaths['user-prefs'];
$DockerClient = new DockerClient();
$DockerTemplates = new DockerTemplates();
$all_containers = $DockerClient->getDockerContainers();
if (!$all_containers) {
echo "
| No Docker containers installed |
";
return;
}
if (file_exists($user_prefs)) {
$prefs = parse_ini_file($user_prefs); $sort = [];
foreach ($all_containers as $ct) $sort[] = array_search($ct['Name'],$prefs) ?? 999;
array_multisort($sort,SORT_NUMERIC,$all_containers);
}
// Read network settings
extract(parse_ini_file('state/network.ini',true));
// Read container info
$all_info = $DockerTemplates->getAllInfo();
$menu = [];
$docker = ['var docker=[];'];
foreach ($all_containers as $ct) {
$name = $ct['Name'];
$info = &$all_info[$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 = [];
$binds = explode('|',docker("inspect --format='{{range \$p,\$c := .HostConfig.PortBindings}}{{\$p}}:{{(index \$c 0).HostPort}}|{{end}}' $name"));
if (count($binds)>1) {
$ip = $ct['Running'] ? docker("inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name") : '0.0.0.0';
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('|',docker("inspect --format='{{range \$p,\$c := .Config.ExposedPorts}}{{\$p}}|{{end}}' $name"));
$ip = $ct['Running'] ? (docker("inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name") ?: $eth0['IPADDR:0']) : '0.0.0.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('|',docker("inspect --format='{{range \$c := .HostConfig.Binds}}{{\$c}}|{{end}}' $name"));
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 " | ";
if ($updateStatus=='false') {
echo " update ready";
} elseif ($updateStatus=='true') {
echo " up-to-date";
echo "";
} else {
echo " not available";
echo "";
}
echo " | $mode | ";
echo "".implode(' ',$ports)." | ";
echo "".implode(' ',$paths)." | ";
echo " | ";
echo " ";
echo htmlspecialchars(str_replace('Up','Uptime',$ct['Status']))." Created ".htmlspecialchars($ct['Created'])." | ";
echo " |
";
}
foreach ($DockerClient->getDockerImages() as $image) {
if (count($image['usedBy'])) continue;
$id = $image['Id'];
$menu[] = sprintf("addDockerImageContext('%s','%s');",$id,implode(',',$image['Tags']));
echo "";
echo "";
echo " ";
echo "  ";
echo " | ";
echo "(orphan image) Image ID: $id ";
echo "".implode(' ',array_map('htmlspecialchars',$image['Tags']))." | ";
echo " | ";
echo "Created ".htmlspecialchars($image['Created'])." |
";
}
echo "\0".implode($menu).implode($docker);
?>