Skip to content
This repository was archived by the owner on Jan 23, 2025. It is now read-only.

Commit 0ebc3e0

Browse files
committed
Add compose short names
This allows compose service names to be used without the project name.
1 parent d9f35e0 commit 0ebc3e0

3 files changed

Lines changed: 50 additions & 11 deletions

File tree

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,12 @@ an exact match is required. If a generated domain address doesn't match the list
7575
```
7676

7777
When the project's name is in the list of _allowed domains_ (`ALLOWED_DOMAINS=.docker,.someproject`), then the
78-
`default_domain` will not be appended:
78+
`default_domain` will not be appended.
79+
80+
If a `<service>` name is unique, then it is available also as `<service>.<default_domain>`.
81+
```
82+
host webserver.docker # webserver.docker has address 172.16.238.3
83+
```
7984

8085
If configured correctly then `resolvectl status` should show the configured link-specific DNS server:
8186

src/systemd_resolved_docker/dockerwatcher.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ def run(self) -> None:
4242
def collect_from_containers(self):
4343
domain_records = {}
4444

45+
non_unique_hostnames = set()
46+
duplicate_hostnames = set()
47+
4548
for c in self.cli.containers.list():
4649
common_hostnames = []
4750

@@ -64,14 +67,20 @@ def collect_from_containers(self):
6467
# for docker-compose services service.project (.docker) names are created
6568
if c.attrs['Config'].get('Labels') and c.attrs['Config']['Labels'].get('com.docker.compose.service') and \
6669
c.attrs['Config']['Labels'].get('com.docker.compose.project'):
67-
common_hostnames.append("%s.%s" % (c.attrs['Config']['Labels'].get('com.docker.compose.service'),
68-
c.attrs['Config']['Labels'].get('com.docker.compose.project')))
70+
compose_service = c.attrs['Config']['Labels'].get('com.docker.compose.service')
71+
compose_project = c.attrs['Config']['Labels'].get('com.docker.compose.project')
72+
73+
common_hostnames.append(compose_service)
74+
common_hostnames.append("%s.%s" % (compose_service, compose_project))
6975

70-
if c.attrs['Config']['Labels'].get('com.docker.compose.container-number'):
71-
common_hostnames.append("%s.%s.%s" % (c.attrs['Config']['Labels'].get('com.docker.compose.container-number'),
72-
c.attrs['Config']['Labels'].get('com.docker.compose.service'),
73-
c.attrs['Config']['Labels'].get(
74-
'com.docker.compose.project')))
76+
if compose_service in non_unique_hostnames:
77+
duplicate_hostnames.add(compose_service)
78+
else:
79+
non_unique_hostnames.add(compose_service)
80+
81+
compose_container_number = c.attrs['Config']['Labels'].get('com.docker.compose.container-number')
82+
if compose_container_number:
83+
common_hostnames.append("%s.%s.%s" % (compose_container_number, compose_service, compose_project))
7584

7685
name = c.attrs['Name'][1:]
7786
settings = c.attrs['NetworkSettings']
@@ -93,6 +102,9 @@ def collect_from_containers(self):
93102

94103
domain_records[ip] = record
95104

105+
for ip, hosts in domain_records.items():
106+
domain_records[ip] = list(filter(lambda h: h not in duplicate_hostnames, hosts))
107+
96108
hostnames = [DockerHost(hosts, ip) for ip, hosts in domain_records.items()]
97109

98110
self.handler.handle_hosts(hostnames)

test/integration/test_compose.sh

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,26 @@ networks:
2626
- $TEST_LABEL
2727
ipam:
2828
driver: default
29-
config:
30-
- subnet: 172.16.238.0/24
31-
gateway: 172.16.238.1
29+
EOF
30+
31+
exec 20<<EOF
32+
version: "2.1"
33+
services:
34+
broker:
35+
image: redis
36+
labels:
37+
- $TEST_LABEL
38+
networks:
39+
- network
40+
41+
networks:
42+
network:
43+
driver: bridge
44+
enable_ipv6: false
45+
labels:
46+
- $TEST_LABEL
47+
ipam:
48+
driver: default
3249
EOF
3350

3451
ALLOWED_DOMAINS=.docker,.$TEST_PREFIX start_systemd_resolved_docker
@@ -46,3 +63,8 @@ query_ok webserver.$TEST_PREFIX $webserver1_ip
4663
query_ok webserver.$TEST_PREFIX $webserver2_ip
4764
query_ok 1.webserver.$TEST_PREFIX $webserver1_ip
4865
query_ok 2.webserver.$TEST_PREFIX $webserver2_ip
66+
67+
query_ok broker.docker $broker1_ip
68+
69+
docker-compose --file /dev/fd/20 --project-name ${TEST_PREFIX}_2 up --detach
70+
query_fail broker.docker

0 commit comments

Comments
 (0)