Skip to content

Commit 6e964ac

Browse files
committed
Correctly extract name from image tag
Fixes #71
1 parent 62a1cb0 commit 6e964ac

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

db-auto-backup.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from datetime import datetime
1010
from io import StringIO
1111
from pathlib import Path
12-
from typing import IO, Callable, Dict, NamedTuple, Optional, Sequence
12+
from typing import IO, Callable, Dict, Iterable, NamedTuple, Optional
1313

1414
import docker
1515
import pycron
@@ -150,7 +150,7 @@ def backup_redis(container: Container) -> str:
150150
INCLUDE_LOGS = bool(os.environ.get("INCLUDE_LOGS"))
151151

152152

153-
def get_backup_provider(container_names: Sequence[str]) -> Optional[BackupProvider]:
153+
def get_backup_provider(container_names: Iterable[str]) -> Optional[BackupProvider]:
154154
for name in container_names:
155155
for provider in BACKUP_PROVIDERS:
156156
if any(fnmatch.fnmatch(name, pattern) for pattern in provider.patterns):
@@ -159,14 +159,23 @@ def get_backup_provider(container_names: Sequence[str]) -> Optional[BackupProvid
159159
return None
160160

161161

162+
def get_container_names(container: Container) -> Iterable[str]:
163+
names = set()
164+
for tag in container.image.tags:
165+
registry, image = docker.auth.resolve_repository_name(tag)
166+
image, tag_name = image.split(":", 1)
167+
names.add(image)
168+
return names
169+
170+
162171
@pycron.cron(SCHEDULE)
163172
def backup(now: datetime) -> None:
164173
docker_client = docker.from_env()
165174

166175
backed_up_containers = []
167176

168177
for container in docker_client.containers.list():
169-
container_names = [tag.rsplit(":", 1)[0] for tag in container.image.tags]
178+
container_names = get_container_names(container)
170179
backup_provider = get_backup_provider(container_names)
171180
if backup_provider is None:
172181
continue

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
docker==6.1.3
1+
docker==7.1.0
22
python-dotenv==1.0.0
33
tqdm==4.66.2
44
requests

tests/tests.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from importlib.util import module_from_spec, spec_from_loader
33
from pathlib import Path
44
from typing import Any, Callable
5+
from unittest.mock import MagicMock
56

67
import pytest
78

@@ -90,3 +91,18 @@ def test_healthchecks_success_hook_url_custom_host(monkeypatch: Any) -> None:
9091
def test_uptime_kuma_success_hook_url(monkeypatch: Any) -> None:
9192
monkeypatch.setenv("UPTIME_KUMA_URL", "https://uptime-kuma.com")
9293
assert db_auto_backup.get_success_hook_url() == "https://uptime-kuma.com"
94+
95+
96+
@pytest.mark.parametrize(
97+
"tag,name",
98+
[
99+
("postgres:14-alpine", "postgres"),
100+
("docker.io/postgres:14-alpine", "postgres"),
101+
("ghcr.io/realorangeone/db-auto-backup:latest", "realorangeone/db-auto-backup"),
102+
("theorangeone/db-auto-backup:latest:latest", "theorangeone/db-auto-backup"),
103+
],
104+
)
105+
def test_get_container_names(tag: str, name: str) -> None:
106+
container = MagicMock()
107+
container.image.tags = [tag]
108+
assert db_auto_backup.get_container_names(container) == {name}

0 commit comments

Comments
 (0)