Class: VagrantPlugins::DockerProvider::Driver

Inherits:
Object
  • Object
show all
Includes:
Vagrant::Util::Retryable
Defined in:
lib/docker-provider/driver.rb

Instance Method Summary collapse

Constructor Details

#initializeDriver

Returns a new instance of Driver.



13
14
15
# File 'lib/docker-provider/driver.rb', line 13

def initialize
  @logger = Log4r::Logger.new("vagrant::docker::driver")
end

Instance Method Details

#all_containersObject



89
90
91
# File 'lib/docker-provider/driver.rb', line 89

def all_containers
  execute('docker', 'ps', '-a', '-q', '-notrunc').to_s.split
end

#create(params) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/docker-provider/driver.rb', line 17

def create(params)
  image   = params.fetch(:image)
  ports   = Array(params[:ports])
  volumes = Array(params[:volumes])
  name    = params.fetch(:name)
  cmd     = Array(params.fetch(:cmd))

  run_cmd = %W(docker run -name #{name} -d)
  run_cmd += ports.map { |p| ['-p', p.to_s] }
  run_cmd += volumes.map { |v| ['-v', v.to_s] }
  run_cmd += %W(-privileged) if params[:privileged]
  run_cmd += %W(-h #{params[:hostname]}) if params[:hostname]
  run_cmd += [image, cmd]

  retryable(tries: 10, sleep: 1) do
    execute(*run_cmd.flatten).chomp
  end
end

#created?(cid) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
50
# File 'lib/docker-provider/driver.rb', line 47

def created?(cid)
  result = execute('docker', 'ps', '-a', '-q', '-notrunc').to_s
  result =~ /^#{Regexp.escape cid}$/
end

#docker_bridge_ipObject



93
94
95
96
97
98
99
100
101
# File 'lib/docker-provider/driver.rb', line 93

def docker_bridge_ip
  output = execute('/sbin/ip', '-4', 'addr', 'show', 'scope', 'global', 'docker0')
  if output =~ /^\s+inet ([0-9.]+)\/[0-9]+\s+/
    return $1.to_s
  else
    # TODO: Raise an user friendly message
    raise 'Unable to fetch docker bridge IP!'
  end
end

#inspect_container(cid) ⇒ Object



83
84
85
86
87
# File 'lib/docker-provider/driver.rb', line 83

def inspect_container(cid)
  # DISCUSS: Is there a chance that this json will change after the container
  #          has been brought up?
  @data ||= JSON.parse(execute('docker', 'inspect', cid)).first
end

#privileged?(cid) ⇒ Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/docker-provider/driver.rb', line 57

def privileged?(cid)
  inspect_container(cid)['HostConfig']['Privileged']
end

#rm(cid) ⇒ Object



77
78
79
80
81
# File 'lib/docker-provider/driver.rb', line 77

def rm(cid)
  if created?(cid)
    execute('docker', 'rm', '-v', cid)
  end
end

#running?(cid) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
55
# File 'lib/docker-provider/driver.rb', line 52

def running?(cid)
  result = execute('docker', 'ps', '-q', '-notrunc')
  result =~ /^#{Regexp.escape cid}$/m
end

#start(cid) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/docker-provider/driver.rb', line 61

def start(cid)
  unless running?(cid)
    execute('docker', 'start', cid)
    # This resets the cached information we have around, allowing `vagrant reload`s
    # to work properly
    # TODO: Add spec to verify this behavior
    @data = nil
  end
end

#state(cid) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/docker-provider/driver.rb', line 36

def state(cid)
  case
  when running?(cid)
    :running
  when created?(cid)
    :stopped
  else
    :not_created
  end
end

#stop(cid) ⇒ Object



71
72
73
74
75
# File 'lib/docker-provider/driver.rb', line 71

def stop(cid)
  if running?(cid)
    execute('docker', 'stop', '-t', '1', cid)
  end
end