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