22# @author Sébastien BEAU <[email protected] > 33# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
44
5- import docker
6- from compose .project import OneOffFilter
7- from compose .cli import command
8- from compose .config .errors import ComposeFileNotFound
5+ from python_on_whales import docker
96from plumbum import local
107
118from .api import logger
@@ -15,42 +12,44 @@ class Project(object):
1512
1613 def __init__ (self ):
1714 try :
18- self .project = command . project_from_options ( "." , {} )
19- except ComposeFileNotFound :
15+ self .project = docker . compose . config ( return_json = True )
16+ except :
2017 print ("No docker-compose found, create one with :" )
2118 print ("$ docky init" )
2219 exit (- 1 )
2320
24- self .name = self .project .name
25- self .loaded_config = None
21+ self .name = self .project .get ( " name" )
22+ self .loaded_config = self . project
2623 self .service = self ._get_main_service (self .project )
2724
2825 def _get_main_service (self , project ):
2926 """main_service has docky.main.service defined in
3027 his label."""
31- for service in project .services :
32- labels = service . options . get ("labels" , {} )
28+ for service in project .get ( " services" ) :
29+ labels = project [ "services" ][ service ]. get ("labels" )
3330 # service.labels() do not contain docky.main.service
3431 # see also compose.service.merge_labels
35- if labels .get ("docky.main.service" , False ):
36- return service .name
32+ if labels :
33+ if labels .get ("docky.main.service" ):
34+ return service
3735
3836 def get_containers (self , service = None ):
39- kwargs = {"one_off" : OneOffFilter . include }
37+ kwargs = {}
4038 if service :
41- kwargs ["service_names " ] = [service ]
42- return self . project . containers (** kwargs )
39+ kwargs ["services " ] = [service ]
40+ return docker . compose . ps (** kwargs )
4341
4442 def display_service_tooltip (self ):
4543 infos = self ._get_services_info ()
46- for service in self .project .services :
47- labels = service .options .get ("labels" , {})
44+ for service in self .project .get ("services" ):
45+ dict_service = self .project ["services" ].get (service )
46+ labels = dict_service .get ("labels" , {})
4847 if labels .get ("docky.access.help" ):
4948 # TODO remove after some versions
5049 logger .warning (
5150 "'docky.access.help' is replaced by 'docky.help'. "
5251 "Please update this key in your docker files." )
53- if infos .get (service . name ):
52+ if infos .get (dict_service . get ( " name" ) ):
5453 # some applications provide extra parameters to access resource
5554 infos [service .name ] += labels .get ("docky.url_suffix" , "" )
5655 logger .info (infos [service .name ])
@@ -60,28 +59,27 @@ def display_service_tooltip(self):
6059 def _get_services_info (self ):
6160 """ Search IP and Port for each services
6261 """
63- client = docker .from_env ()
64- services = (x for x in client .containers .list ()
65- if self .project .name in x .attrs ["Name" ])
6662 infos = {}
67- for serv in services :
63+ main_service = self ._get_main_service (self .project )
64+ for service in self .project .get ("services" ):
65+ if service != main_service :
66+ continue
67+ serv = self .project ["services" ][service ]
6868 proj_key = [
69- x for x in serv .attrs ["NetworkSettings" ]["Networks" ].keys ()
70- if self .project .name in x ]
69+ x for x in serv ["networks" ].keys ()]
7170 proj_key = proj_key and proj_key [0 ] or False
72- if not serv . attrs [ "NetworkSettings" ][ "Networks" ]. get ( proj_key ) :
71+ if not serv [ "networks" ] :
7372 continue
74- ip = serv .attrs ["NetworkSettings" ]["Networks" ][proj_key ].get (
75- "IPAddress" , "" )
73+ ip = serv ["networks" ].get ("IPAdress" , "" )
7674 info = {
77- "name" : serv . attrs [ "Config" ][ "Labels " ].get (
75+ "name" : serv [ "labels " ].get (
7876 "com.docker.compose.service" , "" ),
7977 "ip" : ip ,
80- "port" : [x for x in serv .attrs [ "NetworkSettings" ]. get ("Ports " , "" )]
78+ "port" : [x for x in serv .get ("ports " , "" )],
8179 }
8280 if info ["name" ] != "db" and info .get ("port" ):
8381 urls = ["http://%s:%s" % (info ["ip" ], port .replace ("/tcp" , "" ))
84- for port in info ["port" ]]
82+ for port in info ["port" ][ 0 ] ]
8583 # There is no web app to access 'db' service: try adminer for that
8684 infos [info ["name" ]] = "%s %s" % (info ["name" ], " " .join (urls ))
8785 return infos
@@ -92,9 +90,10 @@ def create_volume(self):
9290 Only apply to external volumes.
9391 docker-compose up do not attemps to create it
9492 so we have to do it ourselves"""
95- for service in self .project .services :
96- for volume in service .options .get ("volumes" , []):
97- if volume .external :
93+ for service in self .project .get ("services" ):
94+ dict_service = self .project ["services" ].get (service )
95+ for volume in dict_service .get ("volumes" , []):
96+ if volume .get ("external" ):
9897 path = local .path (local .env .expand (volume .external ))
9998 if not path .exists ():
10099 logger .info (
@@ -103,7 +102,6 @@ def create_volume(self):
103102 path .mkdir ()
104103
105104 def get_user (self , service_name ):
106- service = self .project .get_service (name = service_name )
107- labels = service .options .get ("labels" )
105+ labels = self .project ["services" ].get (service_name ).get ("labels" )
108106 if labels :
109- return labels .get ("docky.user" , None )
107+ return labels .get ("docky.user" )
0 commit comments