Module: AppRb::Util::Docker

Defined in:
lib/app-rb/util/docker.rb

Class Method Summary collapse

Class Method Details

.add_cron(user, host, image, env, app, crons) ⇒ Object



77
78
79
80
81
82
83
84
# File 'lib/app-rb/util/docker.rb', line 77

def self.add_cron(user, host, image, env, app, crons)
  echos = crons.map { |cron|
    %(echo "#{cron["at"]} __APP=#{app}; start=\\\\\\$(date); (docker run --rm #{env.map { |k, v| "-e #{k}='#{v}' " }.join}#{image} #{cron["cmd"]}; echo start \\\\\\$start, finish \\\\\\$(date)) >> /home/#{user}/crontab__#{app}__#{cron["key"]}.log 2>&1")
  }
  AppRb::Util.do_it %(ssh #{user}@#{host} bash <<EOF
    (crontab -l | grep -v -F '__APP=#{app};'; #{echos.join("; ")}) | crontab -
    \nEOF)
end

.create_one_time_script(user, host, image, env, app) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/app-rb/util/docker.rb', line 63

def self.create_one_time_script(user, host, image, env, app)
  AppRb::Util.do_it "ssh #{user}@#{host} bash <<EOF
    echo '#/bin/bash' > ~/run_#{app}.sh
    echo 'docker run -it --rm #{env.map { |k, v| "-e #{k}='#{v}' " }.join} #{image} \"\\$@\"' >> ~/run_#{app}.sh
    chmod +x ~/run_#{app}.sh
    \nEOF"
end

.ids(user, host, labels = {}) ⇒ Object



33
34
35
36
# File 'lib/app-rb/util/docker.rb', line 33

def self.ids(user, host, labels = {})
  filters = labels.map { |k, v| "-f label=#{k}=#{v} " }.join("")
  AppRb::Util.just_cmd("ssh #{user}@#{host} docker ps -q #{filters}").split("\n")
end

.pull(user, host, image) ⇒ Object



4
5
6
7
8
9
10
11
# File 'lib/app-rb/util/docker.rb', line 4

def self.pull(user, host, image)
  Open3.popen2e("ssh #{user}@#{host} docker pull #{image}") { |i,o,w|
    while line = o.gets do 
      puts "[#{host}] " + line
    end
    raise "FATAL" unless w.value.success?
  }
end

.remove_images(user, host, image_name, keep_tags = []) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'lib/app-rb/util/docker.rb', line 47

def self.remove_images(user, host, image_name, keep_tags = [])
  all_ids = AppRb::Util.just_cmd("ssh #{user}@#{host} docker images #{image_name} -q").split("\n")
  keep_ids = keep_tags.map { |tag|
    AppRb::Util.just_cmd("ssh #{user}@#{host} docker images #{image_name}:#{tag} -q")
  }
  if (all_ids - keep_ids).length > 0
    AppRb::Util.do_it("ssh #{user}@#{host} 'docker rmi #{(all_ids - keep_ids).join(" ")}'; echo ok")
  end
end

.remove_one_time_script(user, host, app) ⇒ Object



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

def self.remove_one_time_script(user, host, app)
  AppRb::Util.do_it "ssh #{user}@#{host} bash <<EOF
    rm -f ~/run_#{app}.sh
    \nEOF"
end

.run(user, host, image, env, cmd) ⇒ Object



57
58
59
60
61
# File 'lib/app-rb/util/docker.rb', line 57

def self.run(user, host, image, env, cmd)
  AppRb::Util.do_it "ssh -t #{user}@#{host} docker run --rm -it " +
    env.map { |k, v| "-e #{k}='#{v}' " }.join +
    "#{image} #{cmd}"
end

.run_batch(user, host, name, image, cmd, labels = {}, env = {}, opts = []) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/app-rb/util/docker.rb', line 13

def self.run_batch(user, host, name, image, cmd, labels = {}, env = {}, opts = [])
  AppRb::Util.do_it "ssh #{user}@#{host} docker run --rm " +
    labels.map { |k, v| "--label #{k}=#{v} " }.join +
    "--name #{name} " +
    opts.join(" ") + " " + 
    env.map { |k, v| "-e #{k}='#{v}' " }.join +
    "#{image} #{cmd}"
end

.run_daemon(user, host, name, image, cmd, labels = {}, env = {}, opts = [], ports = {}) ⇒ Object



22
23
24
25
26
27
28
29
30
31
# File 'lib/app-rb/util/docker.rb', line 22

def self.run_daemon(user, host, name, image, cmd, labels = {}, env = {}, opts = [], ports = {})
  AppRb::Util.do_it "ssh #{user}@#{host} docker run -d " +
    "--restart unless-stopped " +
    labels.map { |k, v| "--label #{k}=#{v} " }.join +
    "--name #{name} " +
    opts.join(" ") + " " + 
    env.map { |k, v| "-e #{k}='#{v}' " }.join +
    ports.map { |k, v| "-p #{k}:#{v} " }.join +
    "#{image} #{cmd}"
end

.stop(user, host, labels = {}, except = nil) ⇒ Object



38
39
40
41
42
43
44
45
# File 'lib/app-rb/util/docker.rb', line 38

def self.stop(user, host, labels = {}, except = nil)
  keep_ids = except ? ids(user, host, labels.merge(except)) : []
  all_ids = ids(user, host, labels)
  if (all_ids - keep_ids).length > 0
    AppRb::Util.do_it("ssh #{user}@#{host} docker stop #{(all_ids - keep_ids).join(" ")}")
    AppRb::Util.do_it("ssh #{user}@#{host} docker rm #{(all_ids - keep_ids).join(" ")}")
  end
end