Skip to content

Commit 8838cc7

Browse files
committed
[UPD] Version 9.0.0 update to use 'docker compose' V2, included library python-on-whales to get some Config information from compose.yml files.
1 parent 4d17596 commit 8838cc7

File tree

6 files changed

+54
-51
lines changed

6 files changed

+54
-51
lines changed

docky/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
from . import cmd
44
from . import common
55
from .main import Docky
6-
from . import dcpatched
6+
# TODO: Check the command 'docky open'
7+
# from . import dcpatched

docky/cmd/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
class Docky(cli.Application):
1515
PROGNAME = "docky"
16-
VERSION = "8.0.0"
16+
VERSION = "9.0.0"
1717
SUBCOMMAND_HELPMSG = None
1818

1919
def _run(self, cmd, retcode=FG):
@@ -44,7 +44,7 @@ def _run(self, *args, **kwargs):
4444

4545
def _init_project(self):
4646
self.project = Project()
47-
self.compose = local["docker-compose"]
47+
self.compose = local["docker"]["compose"]
4848

4949
def main(self, *args, **kwargs):
5050
if self._project_specific:

docky/cmd/kill.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
44

55
from .base import Docky, DockySub
6-
from compose.parallel import parallel_kill
76

87

98
@Docky.subcommand("kill")
@@ -13,5 +12,4 @@ class DockyKill(DockySub):
1312
def _main(self, *args):
1413
# docker compose do not kill the container odoo as is was run
1514
# manually, so we implement our own kill
16-
containers = self.project.get_containers()
17-
parallel_kill(containers, {"signal": "SIGKILL"})
15+
self._run(self.compose["kill", "-s", "SIGKILL"])

docky/cmd/run_open.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,17 @@ def _main(self, *optionnal_command_line):
5757
self._run(self.compose["rm", "-f"])
5858
self.project.display_service_tooltip()
5959
self.project.create_volume()
60-
self._exec("docker-compose", [
61-
"run", "--rm", "--service-ports", "--use-aliases", "-e", "NOGOSU=True",
62-
self.service] + self.cmd)
60+
# Default command
61+
docky_cmd = ["run", "--rm", "--use-aliases", "-e", "NOGOSU=True", self.service] + self.cmd
62+
63+
self._exec("docker", ["compose"] + docky_cmd)
64+
65+
# TODO: Should we use python-on-whales commands?
66+
# Its possible make
67+
# docker.compose.run(self.project.name, and other parameters)
68+
# But until now was not possible make the same command as above,
69+
# if its possible we should consider the option to use it.
70+
# https://gabrieldemarmiesse.github.io/python-on-whales/sub-commands/compose/
6371

6472

6573
@Docky.subcommand("open")

docky/common/project.py

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
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
96
from plumbum import local
107

118
from .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")

requirements.txt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
docker-compose>=1.23.1
1+
python-on-whales
22
plumbum
33
rainbow_logging_handler
44
python-slugify
5-
# Only for solving installation issue with pip that fail to
6-
# solve the version of request compatible with docker and docker-compose
7-
requests<3,>=2.20.0
8-
importlib-metadata; python_version >= '3.10'
9-
PyYAML >= 5.1, < 5.4
5+
requests
6+
importlib-metadata
7+
PyYAML >= 6.0.1

0 commit comments

Comments
 (0)