module Mcrain::DockerMachine
Constants
- DEFAULT_HOSTNAME
- DOCKER_MACHINE_DOCKER_HOME
Attributes
certs_dir[RW]
Public Class Methods
docker_hostname()
click to toggle source
# File lib/mcrain/docker_machine.rb, line 24 def docker_hostname ENV['MCRAIN_DOCKER_HOSTNAME'] || DEFAULT_HOSTNAME end
docker_hostname!()
click to toggle source
# File lib/mcrain/docker_machine.rb, line 28 def docker_hostname! name = docker_hostname return name if valid_docker_hostname? raise "hostname: #{name.inspect} is not valid. Plase set it with docker IP address to /etc/hosts or export MCRAIN_DOCKER_HOSTNAME=(valid-hostname) ." end
docker_machine_name()
click to toggle source
# File lib/mcrain/docker_machine.rb, line 20 def docker_machine_name ENV['DOCKER_MACHINE_NAME'] end
valid_docker_hostname?()
click to toggle source
# File lib/mcrain/docker_machine.rb, line 34 def valid_docker_hostname? return !!IPSocket.getaddress(docker_hostname) rescue SocketError return false end
Public Instance Methods
build_docker_options(uri)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 70 def build_docker_options(uri) d = DockerMachine.certs_dir cert_path = File.join(d, "cert.pem") key_path = File.join(d, "key.pem") files = { ".docker/cert.pem" => cert_path, ".docker/key.pem" => key_path, } download_files_from_vm(uri.host, files) return { client_cert: cert_path, client_key: key_path, scheme: 'https', } end
cp_r(src, dest)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 170 def cp_r(src, dest) used? ? cp_r_remote(src, dest) : cp_r_local(src, dest) end
cp_r_local(src, dest)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 191 def cp_r_local(src, dest) FileUtils.cp_r(src, dest) end
cp_r_remote(src, dest)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 174 def cp_r_remote(src, dest) Dir.mktmpdir("for_tarball") do |dir| tarball_name = "#{File.basename(src)}.tar.gz" FileUtils.chdir(dir) do FileUtils.cp_r(src, ".") unless system("tar zcf #{tarball_name} #{File.basename(src)}") raise "failed to create tarball of #{src} to #{dir}" end end host = URI.parse(ENV["DOCKER_HOST"]).host scp_connect(host) do |scp| scp.upload!(File.join(dir, tarball_name), dest) scp.session.exec!("cd #{dest} && tar zxf #{tarball_name}") end end end
download_files_from_vm(host, files)
click to toggle source
docs.docker.com/reference/api/docker_remote_api/ github.com/boot2docker/boot2docker#ssh-into-vm
can't find tcuser in virtualbox… github.com/docker/machine/blob/master/drivers/vmwarefusion/fusion_darwin.go#L28
# File lib/mcrain/docker_machine.rb, line 91 def download_files_from_vm(host, files) return if files.values.all?{|f| File.readable?(f)} files.values.each{|f| FileUtils.mkdir_p(File.dirname(f))} scp_connect(host) do |scp| files.each do |src, dest| scp.download(src, dest) end end end
mktmpdir(&block)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 120 def mktmpdir(&block) used? ? mktmpdir_ssh(&block) : mktmpdir_local(&block) end
mktmpdir_local(*args) { |r| ... }
click to toggle source
# File lib/mcrain/docker_machine.rb, line 153 def mktmpdir_local(*args) r = Dir.mktmpdir(*args) if block_given? begin yield(r) ensure Mcrain.logger.debug("removing #{r}") begin FileUtils.remove_entry_secure(r, true) rescue => e Mcrain.logger.warn("[#{e.class}] #{e.message}") end end end return r end
mktmpdir_remote(ssh) { |dir| ... }
click to toggle source
# File lib/mcrain/docker_machine.rb, line 130 def mktmpdir_remote(ssh, &block) Dir.mktmpdir do |orig_dir| dir = File.join(DOCKER_MACHINE_DOCKER_HOME, 'tmp', orig_dir) cmd1 = "mkdir -p #{dir}" Mcrain.logger.debug(cmd1) ssh.exec! cmd1 if block_given? begin yield(dir) ensure begin cmd2 = "rm -rf #{dir}" Mcrain.logger.debug(cmd2) ssh.exec! cmd2 rescue => e Mcrain.logger.warn("[#{e.class}] #{e.message}") end end end return dir end end
mktmpdir_ssh(&block)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 124 def mktmpdir_ssh(&block) ssh_to_vm do |ssh| return mktmpdir_remote(ssh, &block) end end
preparing_command()
click to toggle source
# File lib/mcrain/docker_machine.rb, line 48 def preparing_command return "" unless used? name = Mcrain::DockerMachine.docker_machine_name unless `docker-machine status #{name}`.strip.downcase == "running" raise "docker-machine #{name} is not running. Please `docker-machine start #{name}`" end exports = `docker-machine env #{name} 2>/dev/null`.strip.split(/\n/). select{|line| line =~ /\Aexport /} exports.empty? ? '' : "%s && " % exports.join(" && ") end
scp_connect(host, &block)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 101 def scp_connect(host, &block) Net::SCP.start(host, "docker", :password => "tcuser", &block) end
setup_docker_options()
click to toggle source
# File lib/mcrain/docker_machine.rb, line 59 def setup_docker_options if used? require 'docker' uri = URI.parse(ENV["DOCKER_HOST"]) Excon.defaults[:ssl_verify_peer] = false Docker.options = build_docker_options(uri) elsif ENV["DOCKER_HOST"].nil? ENV["DOCKER_HOST"] = "http://localhost:2375" end end
ssh_to_vm(&block)
click to toggle source
# File lib/mcrain/docker_machine.rb, line 112 def ssh_to_vm(&block) host = used? ? URI.parse(ENV["DOCKER_HOST"]).host : "localhost" Mcrain.logger.debug("connection STARTING to #{host} by SSH") r = Net::SSH.start(host, "docker", :password => "tcuser", &block) Mcrain.logger.debug("connection SUCCESS to #{host} by SSH") return r end
tmpdir()
click to toggle source
return temporary dire for 2nd argument of Dir.mktmpdir
# File lib/mcrain/docker_machine.rb, line 108 def tmpdir used? ? File.join(DOCKER_MACHINE_DOCKER_HOME, 'tmp', Dir.tmpdir) : Dir.tmpdir end
used?()
click to toggle source
# File lib/mcrain/docker_machine.rb, line 44 def used? RbConfig::CONFIG["host_os"] =~ /darwin/ end