preview_only: bool = False,
image: Optional[str] = None,
entrypoint: Optional[str] = None,
- extra_entrypoint_args: Optional[List[str]] = None,
uid: Optional[int] = None,
gid: Optional[int] = None,
volume_mounts: Optional[Dict[str, str]] = {},
ports: Optional[List[int]] = [],
dirs: Optional[List[str]] = [],
files: Optional[Dict[str, Any]] = {},
+ extra_container_args: Optional[List[str]] = None,
+ extra_entrypoint_args: Optional[List[str]] = None,
+ custom_configs: Optional[List[CustomConfig]] = None,
):
assert service_type == 'container'
assert service_id is not None
service_type, service_id,
placement=placement, unmanaged=unmanaged,
preview_only=preview_only, config=config,
- networks=networks, extra_entrypoint_args=extra_entrypoint_args)
+ networks=networks, extra_container_args=extra_container_args,
+ extra_entrypoint_args=extra_entrypoint_args,
+ custom_configs=custom_configs)
self.image = image
self.entrypoint = entrypoint
config_json[prop] = value
return config_json
+ def validate(self) -> None:
+ super(CustomContainerSpec, self).validate()
+
+ if self.args and self.extra_container_args:
+ raise SpecValidationError(
+ '"args" and "extra_container_args" are mutually exclusive '
+ '(and both serve the same purpose)')
+
+ if self.files and self.custom_configs:
+ raise SpecValidationError(
+ '"files" and "custom_configs" are mutually exclusive '
+ '(and both serve the same purpose)')
+
yaml.add_representer(CustomContainerSpec, ServiceSpec.yaml_representer)