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