[Web, DockerAPI] Be more like official Docker API
parent
fc18d153cd
commit
3ae0b16845
|
@ -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}):
|
||||||
|
return container.attrs
|
||||||
|
else:
|
||||||
|
return jsonify(message='No or invalid id defined')
|
||||||
|
|
||||||
class ContainerStart(Resource):
|
class container_post(Resource):
|
||||||
def post(self, container_id):
|
def post(self, container_id, post_action):
|
||||||
|
if container_id and container_id.isalnum() and post_action:
|
||||||
|
if post_action == 'stop':
|
||||||
try:
|
try:
|
||||||
dockercli.start(container_id);
|
for container in docker_client.containers.list(all=True, filters={"id": container_id}):
|
||||||
|
container.stop()
|
||||||
except:
|
except:
|
||||||
return 'Error'
|
return 'Error'
|
||||||
else:
|
else:
|
||||||
return 'OK'
|
return 'OK'
|
||||||
|
elif post_action == 'start':
|
||||||
class ContainerStop(Resource):
|
|
||||||
def post(self, container_id):
|
|
||||||
try:
|
try:
|
||||||
dockercli.stop(container_id);
|
for container in docker_client.containers.list(all=True, filters={"id": container_id}):
|
||||||
|
container.start()
|
||||||
except:
|
except:
|
||||||
return 'Error'
|
return 'Error'
|
||||||
else:
|
else:
|
||||||
return 'OK'
|
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(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')
|
||||||
|
|
|
@ -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\"") {
|
||||||
|
|
Loading…
Reference in New Issue