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 --rm " + labels.map { |k, v| "--label #{k}=#{v} " }.join + "--name #{name} " + opts.join(" ") + " " + env.map { |k, v| "-e #{k}='#{v}' " }.join + "#{image} #{cmd}" 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 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 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 def self.create_one_time_script(user, host, image, env, app) AppRb::Util.do_it "ssh #{user}@#{host} 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 def self.remove_one_time_script(user, host, app) AppRb::Util.do_it "ssh #{user}@#{host} bash <> /home/#{user}/crontab__#{app}__#{cron["key"]}.log 2>&1") } AppRb::Util.do_it %(ssh #{user}@#{host} bash <