diff options
| author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2022-02-19 18:06:27 +0000 | 
|---|---|---|
| committer | Viacheslav Hletenko <v.gletenko@vyos.io> | 2022-02-19 20:16:17 +0000 | 
| commit | cf36ced75094a519682875e0e73571824f34b6ec (patch) | |
| tree | 4895eb3c8b98d64f88ea3b8fd58ad73c75692137 /src | |
| parent | 29ba813fb65b8b292105cdae4f8f71fcce6350a1 (diff) | |
| download | vyos-1x-cf36ced75094a519682875e0e73571824f34b6ec.tar.gz vyos-1x-cf36ced75094a519682875e0e73571824f34b6ec.zip  | |
containers: T4249: Allow to connect host device to the container
Ability to attach host devices to the container
It can be disk, USB device or any device from the directory /dev
set container name alp01 device disk source '/dev/vdb1'
set container name alp01 device disk destination '/dev/mydisk'
Diffstat (limited to 'src')
| -rwxr-xr-x | src/conf_mode/containers.py | 22 | 
1 files changed, 21 insertions, 1 deletions
diff --git a/src/conf_mode/containers.py b/src/conf_mode/containers.py index 26c50cab6..516671844 100755 --- a/src/conf_mode/containers.py +++ b/src/conf_mode/containers.py @@ -122,6 +122,18 @@ def verify(container):                          raise ConfigError(f'IP address "{address}" can not be used for a container, '\                                            'reserved for the container engine!') +            if 'device' in container_config: +                for dev, dev_config in container_config['device'].items(): +                    if 'source' not in dev_config: +                        raise ConfigError(f'Device "{dev}" has no source path configured!') + +                    if 'destination' not in dev_config: +                        raise ConfigError(f'Device "{dev}" has no destination path configured!') + +                    source = dev_config['source'] +                    if not os.path.exists(source): +                        raise ConfigError(f'Device "{dev}" source path "{source}" does not exist!') +              if 'environment' in container_config:                  for var, cfg in container_config['environment'].items():                      if 'value' not in cfg: @@ -266,6 +278,14 @@ def apply(container):                      c = c.replace('-', '_')                      cap_add += f' --cap-add={c}' +            # Add a host device to the container /dev/x:/dev/x +            device = '' +            if 'device' in container_config: +                for dev, dev_config in container_config['device'].items(): +                    source_dev = dev_config['source'] +                    dest_dev = dev_config['destination'] +                    device += f' --device={source_dev}:{dest_dev}' +              # Check/set environment options "-e foo=bar"              env_opt = ''              if 'environment' in container_config: @@ -296,7 +316,7 @@ def apply(container):              container_base_cmd = f'podman run --detach --interactive --tty --replace {cap_add} ' \                                   f'--memory {memory}m --memory-swap 0 --restart {restart} ' \ -                                 f'--name {name} {port} {volume} {env_opt}' +                                 f'--name {name} {device} {port} {volume} {env_opt}'              if 'allow_host_networks' in container_config:                  run(f'{container_base_cmd} --net host {image}')              else:  | 
