Module: Jarl::Docker

Defined in:
lib/jarl/docker.rb

Defined Under Namespace

Classes: Container, Image, Ps

Constant Summary collapse

INSECURE_KEY_PATH =
'/home/vagrant/.ssh/insecure_key'

Class Method Summary collapse

Class Method Details

.clean_containersObject

Cleans stopped containers



94
95
96
97
98
99
# File 'lib/jarl/docker.rb', line 94

def self.clean_containers
  sh "docker rm $(docker ps -a | grep 'Exited' | awk '{print $1}')"
rescue RuntimeError => e
  # omit conflicting images error reports
  raise unless e.to_s =~ /Command failed/
end

.clean_imagesObject

Cleans unused images



85
86
87
88
89
90
# File 'lib/jarl/docker.rb', line 85

def self.clean_images
  sh "docker rmi $(docker images -a | grep '^<none>' | awk '{print $3}') >/dev/null 2>&1"
rescue RuntimeError => e
  # omit conflicting images error reports
  raise unless e.to_s =~ /Command failed/
end

.containers_runningObject

Returns a list of running docker containers



58
59
60
61
62
63
64
65
# File 'lib/jarl/docker.rb', line 58

def self.containers_running
  return @docker_containers_running if @docker_containers_running
  container_ids = `docker ps -q`.split("\n")
  @docker_containers_running = container_ids.map do |id|
    Container.new id
  end
  @docker_containers_running
end

.execute(params) ⇒ Object

Execute container in foreground, defined by params



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/jarl/docker.rb', line 125

def self.execute(params)
  container_name = "#{params[:name]}.execute"
  Docker::Container.clean_containers(container_name)
  opts = []
  opts << params[:volumes].map do |v|
    "-v #{v}"
  end.join(' ')
  opts << params[:ports].map do |p|
    "-p #{p}"
  end.join(' ')
  opts << params[:environment].map do |k, v|
    "-e #{k}=#{v}"
  end.join(' ')
  docker_cmd = "docker run -t -i --rm #{opts.join(' ')} " \
    " --hostname #{params[:hostname]} " \
    " --name #{container_name} #{params[:image]} #{params[:command]}"
  # puts docker_cmd
  sh docker_cmd
end

.imagesObject

Returns available docker images



15
16
17
18
19
# File 'lib/jarl/docker.rb', line 15

def self.images
  @docker_images ||= Pathname.glob(Pathname.new(DOCKER_IMAGES_PATH).join('*/')).sort.map do |path|
    Image.new(path.basename, path)
  end
end

.images_unusedObject

Returns a list of unused images



31
32
33
# File 'lib/jarl/docker.rb', line 31

def self.images_unused
  images - images_used
end

.images_usedObject

Returns a list of used images



23
24
25
26
27
# File 'lib/jarl/docker.rb', line 23

def self.images_used
  used_images_list = File.readlines(USED_IMAGES_FILE) rescue ['']
  used_images_list.map!(&:chomp)
  @docker_images_used ||= images.select { |di| used_images_list.include?(di.name) }
end

.images_used_add(name) ⇒ Object

Adds image to a list of used images



37
38
39
40
41
42
43
44
# File 'lib/jarl/docker.rb', line 37

def self.images_used_add(name)
  list = images_used.map(&:name)
  list << name
  File.open(USED_IMAGES_FILE, 'w') do |f|
    f.puts list.join("\n")
  end
  reload!
end

.images_used_remove(name) ⇒ Object

Removes image from a list of used images



48
49
50
51
52
53
54
# File 'lib/jarl/docker.rb', line 48

def self.images_used_remove(name)
  list = images_used.map(&:name).select { |n| n != name }
  File.open(USED_IMAGES_FILE, 'w') do |f|
    f.puts list.join("\n")
  end
  reload!
end

.installed?Boolean

Returns true if Docker is installed

Returns:

  • (Boolean)


9
10
11
# File 'lib/jarl/docker.rb', line 9

def self.installed?
  !`which docker`.empty?
end

.psObject

Returns ‘docker ps` info inspector instance



69
70
71
# File 'lib/jarl/docker.rb', line 69

def self.ps
  @docker_ps ||= Ps.new
end

.reload!Object

Reloads lists of images and containers



76
77
78
79
80
81
# File 'lib/jarl/docker.rb', line 76

def self.reload!
  @docker_ps = nil
  @docker_images = nil
  @docker_images_used = nil
  @docker_containers_running = nil
end

.start(params) ⇒ Object

Start container defined by params



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/jarl/docker.rb', line 103

def self.start(params)
  container_name = params[:name]
  Docker::Container.clean_containers(container_name)
  opts = []
  opts << params[:volumes].map do |v|
    "-v #{v}"
  end.join(' ')
  opts << params[:ports].map do |p|
    "-p #{p}"
  end.join(' ')
  opts << params[:environment].map do |k, v|
    "-e #{k}=#{v}"
  end.join(' ')
  docker_cmd = "docker run -d #{opts.join(' ')} " \
    " --hostname #{params[:hostname]} " \
    " --name #{container_name} #{params[:image]} #{params[:command]}"
  # puts docker_cmd
  sh docker_cmd
end