diff --git a/plugins/docker/index.html b/plugins/docker/index.html index 6c3cfdc0a..1e5831e04 100755 --- a/plugins/docker/index.html +++ b/plugins/docker/index.html @@ -20,6 +20,16 @@ padding: 0 25px; cursor: pointer; } + +.docker-environments { + resize: none; + width: 330px; + height: 80px; + line-height: 20px; + padding: 5px 8px; + border: 1px solid #ddd; + font-size: 12px; +}
diff --git a/plugins/docker/index.py b/plugins/docker/index.py index 134278e6d..e7f6e971e 100755 --- a/plugins/docker/index.py +++ b/plugins/docker/index.py @@ -443,6 +443,85 @@ def dockerLoginCheck(user_name, user_pass, registry): return False +def getDockerIpList(): + # 取IP列表 + path = getServerDir() + ipConf = path + '/iplist.json' + if not os.path.exists(ipConf): + return [] + iplist = json.loads(mw.readFile(ipConf)) + return iplist + + +def getDockerCreateInfo(): + # 取创建依赖 + import psutil + data = {} + data['images'] = imageList() + data['memSize'] = int(psutil.virtual_memory().total / 1024 / 1024) + data['iplist'] = getDockerIpList() + return mw.returnJson(True, 'ok!', data) + + +def __release_port(port): + from collections import namedtuple + try: + import firewall_api + firewall_api.firewall_api().addAcceptPortArgs(port, 'docker', 'port') + return port + except Exception as e: + return "Release failed {}".format(e) + + +def dockerCreateCon(): + args = getArgs() + data = checkArgs(args, ['environments', 'command', + 'entrypoint', 'image', 'mem_limit', 'ports', 'volumes']) + if not data[0]: + return data[1] + + environments = args['environments'] + + c = getDClient() + + # if __name__ == "__main__": + # print(args) + + command = args['command'] + entrypoint = args['entrypoint'] + image = args['image'] + mem_limit = args['mem_limit'] + ports = args['ports'] + ports = ports.replace('[', '(').replace(']', ')') + volumes = args['volumes'] + + try: + environments = environments.strip().split() + + conObject = c.containers.run( + image=image, + mem_limit=mem_limit + 'M', + ports=eval(ports), + auto_remove=False, + command=command, + detach=True, + stdin_open=True, + tty=True, + entrypoint=entrypoint, + privileged=True, + volumes=json.loads(volumes), + cpu_shares=10, + environment=environments + ) + if conObject: + __release_port(ports) + return mw.returnJson(True, '创建成功!') + + return mw.returnJson(False, '创建失败!') + except docker.errors.APIError as ex: + return mw.returnJson(False, '创建失败!' + str(ex)) + + def dockerLogin(): args = getArgs() @@ -576,6 +655,10 @@ if __name__ == "__main__": print(dockerPullReg()) elif func == 'image_list': print(imageListData()) + elif func == 'get_docker_create_info': + print(getDockerCreateInfo()) + elif func == 'docker_create_con': + print(dockerCreateCon()) elif func == 'docker_remove_image': print(dockerRemoveImage()) elif func == 'docker_login': diff --git a/plugins/docker/js/docker.js b/plugins/docker/js/docker.js index 7c37b0cfe..7fd1f6a88 100755 --- a/plugins/docker/js/docker.js +++ b/plugins/docker/js/docker.js @@ -188,7 +188,243 @@ function dockerConListRender(){ } function createConTemplate(){ - console.log('###'); + + dPost('get_docker_create_info','',{},function(rdata){ + var rdata = $.parseJSON(rdata.data); + console.log(rdata); + var rdata = rdata.data; + var imageOpt = ''; + for(var i=0;i'+imageName+''; + } + var iplistOpt = ''; + for(var i=0;i'+rdata.iplist[i].address+''; + } + + var layer_index = layer.open({ + type: 1, + title: "创建容器", + area: '556', + closeBtn: 2, + shadeClose: false, + btn: ['确定', '取消'], + content: '
\ +
\ + 镜像\ +
\ +
\ +
\ + 绑定IP\ +
\ +
\ +
\ + 端口映射\ +
\ +
\ + \ + \ + \ + \ +
\ +
\ + \ + \ +
当前未添加端口映射
\ +
\ +
\ +
\ +
\ + 目录映射\ +
\ +
\ + \ + \ + \ + \ +
\ +
\ + \ + \ +
当前未添加目录映射
\ +
\ +
\ +
\ +
\ + 环境变量
(每行一个)
\ +
\ +
\ + \ +
\ +
\ +
\ +
\ + 内存配额\ +
\ + MB不超过, '+ rdata.memSize +'MB
\ +
\ +
\ + CPU配额\ +
\ + \ + 越大,占用的CPU越多
\ +
\ +
\ + 执行命令\ +
\ +
\ + \ +
', + success:function(){ + $(".bt-cancel").click(function(){ + layer.close(layer_index); + }); + + + $(".plus").click(function(){ + var name1 = $(".type-port input[name='name1']").val(); + var name2 = $(".type-port input[name='name2']").val(); + if(name1 < 1 || name1 > 65535 || name2 < 1 || name2 > 65535 || isNaN(name1) || isNaN(name2)){ + layer.msg('Port setting value range is invalid, range [1-65535]',{icon:2}); + return; + } + + var portval = $('#portabletr')[0].childNodes; + for(var i=0;i',{icon:16,time:0,shade: [0.3, "#000"]}); + $.post('/plugin?action=a&name=docker&s=IsPortExists',{port:port},function(rdata){ + layer.close(loadT); + if(rdata !== false){ + layer.msg('Port ['+name2+'] is already in the mapping list!',{icon:2}); + return; + } + var selecttype = $(".type-port select").val(); + var portable= ''+name1+''+selecttype+''+name2+'Del'; + $("#portabletr").append(portable); + $(".more1").remove(); + $(".minus").click(function(){ + $(this).parents("tr").remove(); + }); + }); + }); + + $(".plus2").click(function(){ + var path1 = $(".type-volumes input[name='path1']").val(); + var path2 = $(".type-volumes input[name='path2']").val(); + + var notPath = ['/boot','/bin','/sbin','/etc','/usr/bin','/usr/sbin','/dev'] + if($.inArray(path2,notPath) != -1){ + layer.msg('Cannot map' + path2,{icon:2}); + return; + } + var portval = $('#portabletr2')[0].childNodes; + for(var i=0;i'+path1+'\ + '+selecttype+''+path2+'\ + Del\ + '; + $("#portabletr2").append(portable); + $(".more2").remove(); + $(".minus2").click(function(){ + $(this).parents("tr").remove(); + }); + }); + }, + yes:function(layero,layer_id){ + console.log(layero,layer_id); + + var ports = {}; + var volumes = {}; + var portval = $('#portabletr')[0].childNodes; + var address = $('.docker-address').val(); + var portval2 = $('#portabletr2')[0].childNodes; + var command = $('.docker-command').val() + var entrypoint = $('.docker-entrypoint').val() + var accept = []; + + //遍历端口映射 + for(var i=0;i rdata.memSize){ + layer.msg('内存配额不能大于物理内存 ['+rdata.memSize+']!',{icon:2}); + return; + } + + if(data.cpu_shares > 100 || data.cpu_shares < 1){ + layer.msg('CPU配额设置值范围应为 [1-100]!',{icon:2}); + return; + } + dPost('docker_create_con','', data, function(rdata){ + var rdata = $.parseJSON(rdata.data); + showMsg(rdata.msg,function(){ + if(rdata.status) { + layer.close(layer_index); + dockerConListRender(); + } + },{ icon: rdata.status ? 1 : 2 }); + }); + } + }); + }); + } function dockerConList(){