From 453e573f28c59319d43fc2c8c4a9f68fe5163636 Mon Sep 17 00:00:00 2001 From: Michael Schiemer Date: Sun, 9 Nov 2025 01:45:35 +0100 Subject: [PATCH] fix: extract and create external Docker networks from compose files - Extract external networks from docker-compose.base.yml and compose override files - Extract network names from 'name:' fields when external: true - Create all required external networks before docker compose up - Fixes error: 'network postgres-staging-internal declared as external, but could not be found' This ensures all external networks (traefik-public, app-internal, postgres-staging-internal, etc.) are created before attempting to start containers. --- deployment/ansible/playbooks/deploy-image.yml | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/deployment/ansible/playbooks/deploy-image.yml b/deployment/ansible/playbooks/deploy-image.yml index d75694f4..3a3a5200 100644 --- a/deployment/ansible/playbooks/deploy-image.yml +++ b/deployment/ansible/playbooks/deploy-image.yml @@ -259,13 +259,47 @@ failed_when: false changed_when: compose_update_alt.changed | default(false) + - name: Extract external networks from docker-compose files + ansible.builtin.shell: | + cd {{ application_code_dest }} + grep -h "external:" docker-compose.base.yml docker-compose.{{ application_compose_suffix }} 2>/dev/null | \ + grep -B 5 "external: true" | \ + grep -E "^\s+[a-zA-Z0-9_-]+:" | \ + sed 's/://' | \ + sed 's/^[[:space:]]*//' | \ + sort -u || echo "" + register: external_networks_raw + changed_when: false + failed_when: false + + - name: Extract external network names (with name: field) + ansible.builtin.shell: | + cd {{ application_code_dest }} + grep -A 2 "external: true" docker-compose.base.yml docker-compose.{{ application_compose_suffix }} 2>/dev/null | \ + grep "name:" | \ + sed 's/.*name:[[:space:]]*//' | \ + sed 's/"//g' | \ + sort -u || echo "" + register: external_network_names + changed_when: false + failed_when: false + + - name: Set list of external networks to create + ansible.builtin.set_fact: + external_networks_to_create: >- + {%- set networks_from_keys = external_networks_raw.stdout | trim | split('\n') | select('match', '.+') | list -%} + {%- set networks_from_names = external_network_names.stdout | trim | split('\n') | select('match', '.+') | list -%} + {%- set all_networks = (networks_from_keys + networks_from_names) | unique | list -%} + {%- set default_networks = ['traefik-public', 'app-internal'] -%} + {%- set final_networks = (all_networks + default_networks) | unique | list -%} + {{ final_networks }} + - name: Ensure Docker networks exist community.docker.docker_network: name: "{{ item }}" state: present - loop: - - traefik-public - - app-internal + driver: bridge + loop: "{{ external_networks_to_create | default(['traefik-public', 'app-internal']) }}" ignore_errors: yes - name: Check if .env file exists