From e860c7709d15148a569326d816ea2e49daa1f528 Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Tue, 26 Feb 2019 11:47:48 -0800 Subject: [PATCH] Begin to setup and configure docker networks for containers --- plugins/providers/docker/action/network.rb | 19 ++++++--- plugins/providers/docker/driver.rb | 46 ++++++++++++++-------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/plugins/providers/docker/action/network.rb b/plugins/providers/docker/action/network.rb index 2d2391e2d..d4cee09c5 100644 --- a/plugins/providers/docker/action/network.rb +++ b/plugins/providers/docker/action/network.rb @@ -11,18 +11,27 @@ module VagrantPlugins def call(env) # If we are using a host VM, then don't worry about it - if env[:machine].provider.host_vm? + machine = env[:machine] + if machine.provider.host_vm? @logger.debug("Not setting up networks because docker host_vm is in use") return @app.call(env) end - env[:machine].config.vm.networks.each do |type, options| + machine.config.vm.networks.each do |type, options| # We only handle private and public networks next if type != :private_network && type != :public_network - # TODO: Configure and set up network for each container that has a network - # machine.id == container id - # docker network name == env[:machine].name + "_vagrant_" + unique-sha + # Look at docker provider config for network options: + # - If not defined, create simple "folder environment" multi-network + # that all containers with this default option are attached to + # - If provider config option is defined, create the requested network + # and attach that container to it + network_name = "#{env[:root_path].basename.to_s}_network_#{machine.name}" + container_id = machine.id + # TODO: Need to check if network already exists and not error + machine.provider.driver.create_network(network_name) + options = ["--ip", options[:ip]] + machine.provider.driver.connect_network(network_name, container_id, options) end @app.call(env) diff --git a/plugins/providers/docker/driver.rb b/plugins/providers/docker/driver.rb index f8f44fe48..9de7d5cd3 100644 --- a/plugins/providers/docker/driver.rb +++ b/plugins/providers/docker/driver.rb @@ -180,43 +180,57 @@ module VagrantPlugins # @param[String] network - name of network to connect conatiner to # @param[String] cid - container id # @param[Array] opts - An array of flags used for listing networks - def connect_network(network, cid, opts=nil) - output = execute('docker', 'network', 'connect', network, cid, opts) + def connect_network(network, cid, *opts) + command = ['docker', 'network', 'connect', network, cid].concat(*opts) + output = execute(*command) + output end # @param[String] network - name of network to create - # @param[Array] opts - An array of flags used for listing networks - def create_network(network, opts=nil) - output = execute('docker', 'network', 'create', network, opts) + # @param[Array] opts - An array of flags used for listing networks + def create_network(network, *opts) + command = ['docker', 'network', 'create', network].concat(*opts) + output = execute(*command) + output end # @param[String] network - name of network to disconnect container from # @param[String] cid - container id - # @param[Array] opts - An array of flags used for listing networks - def disconnect_network(network, cid, opts=nil) - output = execute('docker', 'network', 'disconnect', network, cid, opts) + # @param[Array] opts - An array of flags used for listing networks + def disconnect_network(network, cid, *opts) + command = ['docker', 'network', 'disconnect', network, cid].concat(*opts) + output = execute(*command) + output end # @param[Array] networks - list of networks to inspect # @param[Array] opts - An array of flags used for listing networks - def inspect_network(networks, opts=nil) - output = execute('docker', 'network', 'inspect', networks, opts) + def inspect_network(networks, *opts) + command = ['docker', 'network', 'inspect', networks].concat(*opts) + output = execute(*command) + output end # @param[Array] opts - An array of flags used for listing networks - def list_network(opts=nil) - output = execute('docker', 'network', 'ls', opts) + def list_network(*opts) + command = ['docker', 'network', 'ls'].concat(*opts) + output = execute(*command) + output end # @param[Array] opts - An array of flags used for listing networks - def prune_network(opts=nil) - output = execute('docker', 'network', 'prune', '--force', opts) + def prune_network(*opts) + command = ['docker', 'network', 'prune', '--force'].concat(*opts) + output = execute(*command) + output end # @param[String] network - name of network to remove # @param[Array] opts - An array of flags used for listing networks - def rm_network(networks, opts=nil) - output = execute('docker', 'network', 'rm', network, opts) + def rm_network(networks, *opts) + command = ['docker', 'network', 'rm', network].concat(*opts) + output = execute(*command) + output end # @param[Array] opts - An array of flags used for listing networks