diff --git a/README.md b/README.md index 8ff34f534dda62daba85733df45380bf85cd3087..f5f1e39f53ee7c3f9d7c4eb404c4b440cd38d821 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ an exact match is required. If a generated domain address doesn't match the list d6d51528ac46 alpine "/bin/sh" 8 seconds ago Up 6 seconds relaxed_cartwright ``` -1. `<container_hostname>.<default_domain>`, `<container_hostname>.<container_domain>.<default_domain>`, `<container_hostname>.<container_domain>` +2. `<container_hostname>.<default_domain>`, `<container_hostname>.<container_domain>.<default_domain>`, `<container_hostname>.<container_domain>` If an explicit `--hostname` is provided then that may also be used: ```sh @@ -49,7 +49,7 @@ an exact match is required. If a generated domain address doesn't match the list docker run --rm -it --hostname test --domainname local alpine # test.local ``` -1. `<container_name>.<container_network>.<default_domain>`, `<container_name>.<container_network>` +3. `<container_name>.<container_network>.<default_domain>`, `<container_name>.<container_network>` If a non-default network is used (not `bridge` or `host`) then a name will be generated based on the network's name: ```sh @@ -63,6 +63,20 @@ an exact match is required. If a generated domain address doesn't match the list docker run --rm -it --name db --network somenet alpine # db.somenet.docker ``` +4. `<service>.<project>.<default_domain>`, `<service>.<project>`, + `<container_number>.<service>.<project>.<default_domain>`, `<container_number>.<service>.<project>` + + If `docker-compose` is then names will be generated based on the service and project's names. If a service has + multiple containers then the reply will contain all instances: + ```sh + host webserver.someproject.docker # webserver.someproject.docker has address 172.16.238.3 + # webserver.someproject.docker has address 172.16.238.4 + host 1.webserver.someproject.docker # 1.webserver.someproject.docker has address 172.16.238.3 + ``` + + When the project's name is in the list of _allowed domains_ (`ALLOWED_DOMAINS=.docker,.someproject`), then the + `default_domain` will not be appended: + If configured correctly then `resolvectl status` should show the configured link-specific DNS server: $ resolvectl status diff --git a/src/systemd_resolved_docker/dockerwatcher.py b/src/systemd_resolved_docker/dockerwatcher.py index aae6d15cb61d688738aa4c0b6685766b8a5a2277..02ee5ef7af964b015411b9590972d92de46c3b23 100644 --- a/src/systemd_resolved_docker/dockerwatcher.py +++ b/src/systemd_resolved_docker/dockerwatcher.py @@ -49,7 +49,7 @@ class DockerWatcher(Thread): hostname = c.attrs['Config']['Hostname'] domain = c.attrs['Config'].get('Domainname') - # if no explicit --hostname is provided, than it will be the first 12 characters of the container_id. + # if no explicit --hostname is provided, then it will be the first 12 characters of the container_id. # In that case, the hostname can be ignored if hostname != container_id[:12]: if len(domain) > 0: @@ -57,6 +57,18 @@ class DockerWatcher(Thread): else: common_hostnames.append(hostname) + # for docker-compose services service.project (.docker) names are created + if c.attrs['Config'].get('Labels') and c.attrs['Config']['Labels'].get('com.docker.compose.service') and \ + c.attrs['Config']['Labels'].get('com.docker.compose.project'): + common_hostnames.append("%s.%s" % (c.attrs['Config']['Labels'].get('com.docker.compose.service'), + c.attrs['Config']['Labels'].get('com.docker.compose.project'))) + + if c.attrs['Config']['Labels'].get('com.docker.compose.container-number'): + common_hostnames.append("%s.%s.%s" % (c.attrs['Config']['Labels'].get('com.docker.compose.container-number'), + c.attrs['Config']['Labels'].get('com.docker.compose.service'), + c.attrs['Config']['Labels'].get( + 'com.docker.compose.project'))) + name = c.attrs['Name'][1:] settings = c.attrs['NetworkSettings'] for netname, network in settings.get('Networks', {}).items():