Repository: basecamp/kamal (Ruby)

Issue:
Allow overriding custom `kamal` network
hey 👋🏻 

I'm running a couple of accessories that require host network mode and since v2, Kamnal forces the usage of custom `kamal` network.

Is there any chance to make this option configurable? These containers do not run behind a proxy anyway so there's no need for them to be discoverable


Discussion: According to the upgrade guide, the recommendation for customizing the network is to use the `docker-setup` hook. https://kamal-deploy.org/docs/upgrading/network-changes/
then I would need to create a network called “kamal” with host access, which is far from ideal. i dont want all containers with host access, nor have to deal with port mapping because some containers port clash and host network exposes it all
@djmb I can add a configuration option to change the network if you are okay with this.
> then I would need to create a network called “kamal” with host access, which is far from ideal. i dont want all containers with host access, nor have to deal with port mapping because some containers port clash and host network exposes it all

I don't think this would work - it would put the app and proxy containers in a host network as well, and then the proxy won't be able to access the app container by its container ID.

@igor-alexandrov - yes please if you have a chance to add this 👍

We'd add something like `network: <name>` I guess and then you can set it to `network: host`?

```yaml
accessories:
  redis:
    image: redis:latest
    port: 6379
    network: host
```

you can have your accessories on multiple networks, for example for a Typesense cluster, static IPs are required. I solved this by adding:
```
accessories:
  typesense:
    options:
      network: name=my-custom-net,ip=my-custom-ip
```

this way the accessory is on the kamal network as well on my-custom-net
`host` network can't be mixed with `bridge` network for example



Fix (patch):
diff --git a/lib/kamal/commands/accessory.rb b/lib/kamal/commands/accessory.rb
index 0c1b9009c..9abb6dfc0 100644
--- a/lib/kamal/commands/accessory.rb
+++ b/lib/kamal/commands/accessory.rb
@@ -1,7 +1,7 @@
 class Kamal::Commands::Accessory < Kamal::Commands::Base
   attr_reader :accessory_config
   delegate :service_name, :image, :hosts, :port, :files, :directories, :cmd,
-           :publish_args, :env_args, :volume_args, :label_args, :option_args,
+           :network_args, :publish_args, :env_args, :volume_args, :label_args, :option_args,
            :secrets_io, :secrets_path, :env_directory,
            to: :accessory_config
 
@@ -15,7 +15,7 @@ def run
       "--name", service_name,
       "--detach",
       "--restart", "unless-stopped",
-      "--network", "kamal",
+      *network_args,
       *config.logging_args,
       *publish_args,
       *env_args,
@@ -64,7 +64,7 @@ def execute_in_new_container(*command, interactive: false)
     docker :run,
       ("-it" if interactive),
       "--rm",
-      "--network", "kamal",
+      *network_args,
       *env_args,
       *volume_args,
       image,
diff --git a/lib/kamal/configuration/accessory.rb b/lib/kamal/configuration/accessory.rb
index 804a15029..3258c9d09 100644
--- a/lib/kamal/configuration/accessory.rb
+++ b/lib/kamal/configuration/accessory.rb
@@ -1,6 +1,8 @@
 class Kamal::Configuration::Accessory
   include Kamal::Configuration::Validation
 
+  DEFAULT_NETWORK = "kamal"
+
   delegate :argumentize, :optionize, to: Kamal::Utils
 
   attr_reader :name, :accessory_config, :env
@@ -38,6 +40,10 @@ def port
     end
   end
 
+  def network_args
+    argumentize "--network", network
+  end
+
   def publish_args
     argumentize "--publish", port if port
   end
@@ -173,4 +179,8 @@ def hosts_from_roles
         accessory_config["roles"].flat_map { |role| config.role(role).hosts }
       end
     end
+
+    def network
+      accessory_config["network"] || DEFAULT_NETWORK
+    end
 end
diff --git a/lib/kamal/configuration/docs/accessory.yml b/lib/kamal/configuration/docs/accessory.yml
index 86d49b77a..e77bf754f 100644
--- a/lib/kamal/configuration/docs/accessory.yml
+++ b/lib/kamal/configuration/docs/accessory.yml
@@ -90,3 +90,11 @@ accessories:
     # They are not created or copied before mounting:
     volumes:
       - /path/to/mysql-logs:/var/log/mysql
+
+    # Network
+    #
+    # The network the accessory will be attached to.
+    #
+    # Defaults to kamal:
+    network: custom
+