diff --git a/docker/swarm-exec/inputs.tf b/docker/swarm-exec/inputs.tf
new file mode 100644
index 0000000..98798e5
--- /dev/null
+++ b/docker/swarm-exec/inputs.tf
@@ -0,0 +1,17 @@
+variable "command" {
+  type        = string
+  description = "The command to run in the container."
+}
+variable "image" {
+  type        = string
+  description = "The docker image to use for the swarm-exec service."
+  default     = "mavenugo/swarm-exec:17.03.0-ce"
+}
+variable "stack_name" {
+  description = "The name of the collective stack"
+  type        = string
+}
+variable "service_name" {
+  description = "The name of the service"
+  type        = string
+}
\ No newline at end of file
diff --git a/docker/swarm-exec/swarm-exec.tf b/docker/swarm-exec/swarm-exec.tf
new file mode 100644
index 0000000..f94b42e
--- /dev/null
+++ b/docker/swarm-exec/swarm-exec.tf
@@ -0,0 +1,10 @@
+module "swarm_exec" {
+  source       = "../service"
+  image        = var.image
+  stack_name   = var.stack_name
+  service_name = var.service_name
+  mounts       = { "/var/run/docker.sock" = "/var/run/docker.sock" }
+  global       = true
+  one_shot     = true
+  command      = ["sh", "-c", var.command]
+}
diff --git a/docker/swarm-exec/terraform.tf b/docker/swarm-exec/terraform.tf
new file mode 100644
index 0000000..0814b57
--- /dev/null
+++ b/docker/swarm-exec/terraform.tf
@@ -0,0 +1,11 @@
+terraform {
+  required_version = "~> 1.6"
+  required_providers {
+    docker = {
+      source  = "kreuzwerker/docker"
+      version = "~>3.0"
+    }
+  }
+}
+
+