From 6087e1cd31bc865fccc17c3ce2ec64ef0b142179 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Sat, 10 Aug 2024 02:32:21 +0000 Subject: [PATCH] Copy config under a volume for Docker (similar to a ConfigMap for K8S). (#914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This emulates the K8S ConfigMap behavior on Docker by using a regular volume. If a directory exists under `config/` which matches a named volume, the contents will be copied to the volume on `create` (provided the destination volume is empty). That is, rather than a ConfigMap, it is essentially a "config volume". For example, with a compose file like: ``` version: '3.7' services: caddy: image: cerc/caddy-ethcache:local restart: always volumes: - caddyconfig:/etc/caddy:ro volumes: caddyconfig: ``` And a directory: ``` ❯ ls stack-orchestrator/config/caddyconfig/ Caddyfile ``` After `laconic-so deploy create --spec-file caddy.yml --deployment-dir /srv/caddy` there will be: ``` ❯ ls /srv/caddy/data/caddyconfig Caddyfile ``` Mounted at `/etc/caddy` Reviewed-on: https://git.vdb.to/cerc-io/stack-orchestrator/pulls/914 Reviewed-by: David Boreham Co-authored-by: Thomas E Lackey Co-committed-by: Thomas E Lackey --- stack_orchestrator/deploy/deployment_create.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/stack_orchestrator/deploy/deployment_create.py b/stack_orchestrator/deploy/deployment_create.py index 1534dcbb..9d45f226 100644 --- a/stack_orchestrator/deploy/deployment_create.py +++ b/stack_orchestrator/deploy/deployment_create.py @@ -520,6 +520,16 @@ def create_operation(deployment_command_context, spec_file, deployment_dir, netw if os.path.exists(source_config_dir): destination_config_dir = deployment_dir_path.joinpath("configmaps", configmap) copytree(source_config_dir, destination_config_dir, dirs_exist_ok=True) + else: + # TODO: We should probably only do this if the volume is marked :ro. + for volume_name, volume_path in parsed_spec.get_volumes().items(): + source_config_dir = resolve_config_dir(stack_name, volume_name) + # Only copy if the source exists and is _not_ empty. + if os.path.exists(source_config_dir) and os.listdir(source_config_dir): + destination_config_dir = deployment_dir_path.joinpath(volume_path) + # Only copy if the destination exists and _is_ empty. + if os.path.exists(destination_config_dir) and not os.listdir(destination_config_dir): + copytree(source_config_dir, destination_config_dir, dirs_exist_ok=True) # Delegate to the stack's Python code # The deploy create command doesn't require a --stack argument so we need to insert the