[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_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__)
api = Api(app)
class Containers(Resource):
class containers_get(Resource):
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):
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}):
return container.attrs
else:
return jsonify(message='No or invalid id defined')
class ContainerStart(Resource):
def post(self, container_id):
class container_post(Resource):
def post(self, container_id, post_action):
if container_id and container_id.isalnum() and post_action:
if post_action == 'stop':
try:
dockercli.start(container_id);
for container in docker_client.containers.list(all=True, filters={"id": container_id}):
container.stop()
except:
return 'Error'
else:
return 'OK'
class ContainerStop(Resource):
def post(self, container_id):
elif post_action == 'start':
try:
dockercli.stop(container_id);
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:
return jsonify(message='Invalid container id or missing action')
api.add_resource(Containers, '/info/container/all')
api.add_resource(ContainerInfo, '/info/container/<string:container_id>')
api.add_resource(ContainerStop, '/stop/container/<string:container_id>')
api.add_resource(ContainerStart, '/start/container/<string:container_id>')
api.add_resource(containers_get, '/containers/json')
api.add_resource(container_get, '/containers/<string:container_id>/json')
api.add_resource(container_post, '/containers/<string:container_id>/<string:post_action>')
if __name__ == '__main__':
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' ));
switch($action) {
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_POST, 0);
$response = curl_exec($curl);
@ -25,7 +25,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
$containers = json_decode($response, true);
if (!empty($containers)) {
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']);
}
}
@ -36,7 +36,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
case 'info':
$container_id = docker($service_name, 'get_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_POST, 0);
$response = curl_exec($curl);
@ -63,7 +63,7 @@ function docker($service_name, $action, $post_action = null, $post_fields = null
if (!empty($post_action)) {
$container_id = docker($service_name, 'get_id');
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);
if (!empty($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") {
$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');
$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\"") {
@ -101,12 +101,12 @@ if ($_GET['ACTION'] == "start") {
usleep(1500000);
$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") {
$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');
$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\"") {