[Web, DockerAPI] Be more like official Docker API

master
andryyy 2017-10-06 10:20:40 +02:00
parent fc18d153cd
commit 3ae0b16845
2 changed files with 45 additions and 32 deletions

View File

@ -1,41 +1,54 @@
from flask import Flask from flask import Flask
from flask_restful import Resource, Api from flask_restful import Resource, Api
from docker import APIClient from flask import jsonify
import docker
dockercli = APIClient(base_url='unix://var/run/docker.sock') docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock')
app = Flask(__name__) app = Flask(__name__)
api = Api(app) api = Api(app)
class Containers(Resource): class containers_get(Resource):
def get(self): def get(self):
return dockercli.containers(all=True) containers = {}
for container in docker_client.containers.list(all=True):
containers.update({container.attrs['Id']: container.attrs})
return containers
class ContainerInfo(Resource): class container_get(Resource):
def get(self, container_id): def get(self, container_id):
return dockercli.containers(all=True, filters={"id": container_id}) if container_id and container_id.isalnum():
for container in docker_client.containers.list(all=True, filters={"id": container_id}):
class ContainerStart(Resource): return container.attrs
def post(self, container_id):
try:
dockercli.start(container_id);
except:
return 'Error'
else: else:
return 'OK' return jsonify(message='No or invalid id defined')
class ContainerStop(Resource): class container_post(Resource):
def post(self, container_id): def post(self, container_id, post_action):
try: if container_id and container_id.isalnum() and post_action:
dockercli.stop(container_id); if post_action == 'stop':
except: try:
return 'Error' for container in docker_client.containers.list(all=True, filters={"id": container_id}):
container.stop()
except:
return 'Error'
else:
return 'OK'
elif post_action == 'start':
try:
for container in docker_client.containers.list(all=True, filters={"id": container_id}):
container.start()
except:
return 'Error'
else:
return 'OK'
else:
return jsonify(message='Invalid action')
else: else:
return 'OK' return jsonify(message='Invalid container id or missing action')
api.add_resource(Containers, '/info/container/all') api.add_resource(containers_get, '/containers/json')
api.add_resource(ContainerInfo, '/info/container/<string:container_id>') api.add_resource(container_get, '/containers/<string:container_id>/json')
api.add_resource(ContainerStop, '/stop/container/<string:container_id>') api.add_resource(container_post, '/containers/<string:container_id>/<string:post_action>')
api.add_resource(ContainerStart, '/start/container/<string:container_id>')
if __name__ == '__main__': if __name__ == '__main__':
app.run(debug=False, host='0.0.0.0', port='8080') app.run(debug=False, host='0.0.0.0', port='8080')

View File

@ -11,7 +11,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
curl_setopt($curl, CURLOPT_HTTPHEADER,array( 'Content-Type: application/json' )); curl_setopt($curl, CURLOPT_HTTPHEADER,array( 'Content-Type: application/json' ));
switch($action) { switch($action) {
case 'get_id': case 'get_id':
curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/info/container/all'); curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/json');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 0); curl_setopt($curl, CURLOPT_POST, 0);
$response = curl_exec($curl); $response = curl_exec($curl);
@ -25,7 +25,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
$containers = json_decode($response, true); $containers = json_decode($response, true);
if (!empty($containers)) { if (!empty($containers)) {
foreach ($containers as $container) { foreach ($containers as $container) {
if ($container['Labels']['com.docker.compose.service'] == $service_name) { if ($container['Config']['Labels']['com.docker.compose.service'] == $service_name) {
return trim($container['Id']); return trim($container['Id']);
} }
} }
@ -36,7 +36,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
case 'info': case 'info':
$container_id = docker($service_name, 'get_id'); $container_id = docker($service_name, 'get_id');
if (ctype_xdigit($container_id)) { if (ctype_xdigit($container_id)) {
curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/info/container/' . $container_id); curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/json');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 0); curl_setopt($curl, CURLOPT_POST, 0);
$response = curl_exec($curl); $response = curl_exec($curl);
@ -63,7 +63,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
if (!empty($post_action)) { if (!empty($post_action)) {
$container_id = docker($service_name, 'get_id'); $container_id = docker($service_name, 'get_id');
if (ctype_xdigit($container_id) && ctype_alnum($post_action)) { if (ctype_xdigit($container_id) && ctype_alnum($post_action)) {
curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/' . $post_action . '/container/' . $container_id); curl_setopt($curl, CURLOPT_URL, 'http://dockerapi:8080/containers/' . $container_id . '/' . $post_action);
curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POST, 1);
if (!empty($post_fields)) { if (!empty($post_fields)) {
curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode($post_fields)); curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode($post_fields));
@ -92,7 +92,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
if ($_GET['ACTION'] == "start") { if ($_GET['ACTION'] == "start") {
$retry = 0; $retry = 0;
while (docker('sogo-mailcow', 'info')[0]['State'] != "running" && $retry <= 3) { while (docker('sogo-mailcow', 'info')['State']['Running'] != 1 && $retry <= 3) {
$response = docker('sogo-mailcow', 'post', 'start'); $response = docker('sogo-mailcow', 'post', 'start');
$last_response = (trim($response) == "\"OK\"") ? '<b><span class="pull-right text-success">OK</span></b>' : '<b><span class="pull-right text-danger">Error: ' . $response . '</span></b>'; $last_response = (trim($response) == "\"OK\"") ? '<b><span class="pull-right text-success">OK</span></b>' : '<b><span class="pull-right text-danger">Error: ' . $response . '</span></b>';
if (trim($response) == "\"OK\"") { if (trim($response) == "\"OK\"") {
@ -101,12 +101,12 @@ if ($_GET['ACTION'] == "start") {
usleep(1500000); usleep(1500000);
$retry++; $retry++;
} }
echo (!isset($last_response)) ? '<b><span class="pull-right text-warning">Not running</span></b>' : $last_response; echo (!isset($last_response)) ? '<b><span class="pull-right text-warning">Already running</span></b>' : $last_response;
} }
if ($_GET['ACTION'] == "stop") { if ($_GET['ACTION'] == "stop") {
$retry = 0; $retry = 0;
while (docker('sogo-mailcow', 'info')[0]['State'] == "running" && $retry <= 3) { while (docker('sogo-mailcow', 'info')['State']['Running'] == 1 && $retry <= 3) {
$response = docker('sogo-mailcow', 'post', 'stop'); $response = docker('sogo-mailcow', 'post', 'stop');
$last_response = (trim($response) == "\"OK\"") ? '<b><span class="pull-right text-success">OK</span></b>' : '<b><span class="pull-right text-danger">Error: ' . $response . '</span></b>'; $last_response = (trim($response) == "\"OK\"") ? '<b><span class="pull-right text-success">OK</span></b>' : '<b><span class="pull-right text-danger">Error: ' . $response . '</span></b>';
if (trim($response) == "\"OK\"") { if (trim($response) == "\"OK\"") {