From 088b5fd54b99c0551d534ccbd179de0d85ba9b0f Mon Sep 17 00:00:00 2001 From: Eric Driussi Date: Sun, 22 Mar 2026 12:05:16 +0000 Subject: [PATCH 1/4] operations.docker: add support for custom command --- src/pyinfra/operations/docker.py | 11 +++++++++++ src/pyinfra/operations/util/docker.py | 2 ++ .../add_container_with_command.json | 17 +++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 tests/operations/docker.container/add_container_with_command.json diff --git a/src/pyinfra/operations/docker.py b/src/pyinfra/operations/docker.py index d78b4f5a5..c569dc27c 100644 --- a/src/pyinfra/operations/docker.py +++ b/src/pyinfra/operations/docker.py @@ -36,6 +36,7 @@ def container( restart_policy: str | None = None, auto_remove: bool = False, dns: list[str] | None = None, + command: str = "", ): """ Manage Docker containers @@ -55,6 +56,7 @@ def container( + restart_policy: restart policy to apply when a container exits + auto_remove: automatically remove the container and its associated anonymous volumes when it exits + dns: list of dns servers to be used by the container + + command: custom command to run on container start **Examples:** @@ -89,6 +91,14 @@ def container( container="nginx", start=True, ) + + # Run a custom command on container start + # Note: you can omit the shell (sh -c) to use the default shell of the container + docker.container( + name="Run a custom command", + container="alpine", + command="sh -c 'echo Whatever you want", + ) """ want_spec = ContainerSpec( @@ -103,6 +113,7 @@ def container( restart_policy, auto_remove, dns or list(), + command, ) existent_container = host.get_fact(DockerContainer, object_id=container) diff --git a/src/pyinfra/operations/util/docker.py b/src/pyinfra/operations/util/docker.py index 43836867c..cb47cdccd 100644 --- a/src/pyinfra/operations/util/docker.py +++ b/src/pyinfra/operations/util/docker.py @@ -169,6 +169,7 @@ class ContainerSpec: restart_policy: str | None = None auto_remove: bool = False dns: list[str] = field(default_factory=list) + command: str = "" def container_create_args(self): args = [] @@ -203,6 +204,7 @@ def container_create_args(self): args.append("--dns {0}".format(dns)) args.append(self.image) + args.append(self.command) return args diff --git a/tests/operations/docker.container/add_container_with_command.json b/tests/operations/docker.container/add_container_with_command.json new file mode 100644 index 000000000..d99d02ed8 --- /dev/null +++ b/tests/operations/docker.container/add_container_with_command.json @@ -0,0 +1,17 @@ +{ + "kwargs": { + "container": "nginx", + "image": "nginx:alpine", + "present": "true", + "start": false, + "command": "sh -c 'echo leroy jenkins'" + }, + "facts": { + "docker.DockerContainer": { + "object_id=nginx": [] + } + }, + "commands": [ + "docker container create --name nginx nginx:alpine sh -c 'echo leroy jenkins'" + ] +} From afd65afe277dab3521ec6088d0895ed7c85c5e11 Mon Sep 17 00:00:00 2001 From: Eric Driussi Date: Sat, 25 Apr 2026 19:00:45 +0100 Subject: [PATCH 2/4] operations.docker: nicer default values --- src/pyinfra/operations/docker.py | 2 +- src/pyinfra/operations/util/docker.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pyinfra/operations/docker.py b/src/pyinfra/operations/docker.py index c569dc27c..a48759fa7 100644 --- a/src/pyinfra/operations/docker.py +++ b/src/pyinfra/operations/docker.py @@ -36,7 +36,7 @@ def container( restart_policy: str | None = None, auto_remove: bool = False, dns: list[str] | None = None, - command: str = "", + command: str | None = None, ): """ Manage Docker containers diff --git a/src/pyinfra/operations/util/docker.py b/src/pyinfra/operations/util/docker.py index cb47cdccd..beb2b84d8 100644 --- a/src/pyinfra/operations/util/docker.py +++ b/src/pyinfra/operations/util/docker.py @@ -169,7 +169,7 @@ class ContainerSpec: restart_policy: str | None = None auto_remove: bool = False dns: list[str] = field(default_factory=list) - command: str = "" + command: str | None = None def container_create_args(self): args = [] From c949470d33edb415f558acfc935ac8cc829b9b73 Mon Sep 17 00:00:00 2001 From: Eric Driussi Date: Sat, 25 Apr 2026 19:01:23 +0100 Subject: [PATCH 3/4] operations.docker: only append cmd if present --- src/pyinfra/operations/util/docker.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pyinfra/operations/util/docker.py b/src/pyinfra/operations/util/docker.py index beb2b84d8..bccedca67 100644 --- a/src/pyinfra/operations/util/docker.py +++ b/src/pyinfra/operations/util/docker.py @@ -204,7 +204,8 @@ def container_create_args(self): args.append("--dns {0}".format(dns)) args.append(self.image) - args.append(self.command) + if self.command: + args.append(self.command) return args From 8d9e34987f7d79f0b5694a37d9341cceadcf6da3 Mon Sep 17 00:00:00 2001 From: Eric Driussi Date: Sat, 25 Apr 2026 19:01:59 +0100 Subject: [PATCH 4/4] operations.docker: fix quotes in example --- src/pyinfra/operations/docker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyinfra/operations/docker.py b/src/pyinfra/operations/docker.py index a48759fa7..b79c41bce 100644 --- a/src/pyinfra/operations/docker.py +++ b/src/pyinfra/operations/docker.py @@ -97,7 +97,7 @@ def container( docker.container( name="Run a custom command", container="alpine", - command="sh -c 'echo Whatever you want", + command="sh -c 'echo Whatever you want'", ) """