class Train::Transports::Docker::Connection

Public Class Methods

new(conf) click to toggle source
Calls superclass method
# File lib/train/transports/docker.rb, line 54
def initialize(conf)
  super(conf)
  @id = options[:host]

  docker_url = options[:docker_url]
  if RUBY_PLATFORM =~ /windows|mswin|msys|mingw|cygwin/
    # Docker Desktop for windows. Must override socket location.
    # https://docs.docker.com/desktop/faqs/#how-do-i-connect-to-the-remote-docker-engine-api
    # docker_socket ||= "npipe:////./pipe/docker_engine" # # Doesn't require a settings change, but also doesn't work
    docker_url ||= "tcp://localhost:2375"
  end
  Docker.url = docker_url if docker_url

  @container = ::Docker::Container.get(@id) ||
    raise("Can't find Docker container #{@id}")
  @cmd_wrapper = nil
  @cmd_wrapper = CommandWrapper.load(self, @options)
  @probably_windows = nil
end

Public Instance Methods

close() click to toggle source
# File lib/train/transports/docker.rb, line 74
def close
  # nothing to do at the moment
end
uri() click to toggle source
# File lib/train/transports/docker.rb, line 78
def uri
  if @container.nil?
    "docker://#{@id}"
  else
    "docker://#{@container.id}"
  end
end

Private Instance Methods

cmd_run_command(cmd) click to toggle source
# File lib/train/transports/docker.rb, line 125
def cmd_run_command(cmd)
  ["cmd.exe", "/s", "/c", cmd]
end
file_via_connection(path) click to toggle source
# File lib/train/transports/docker.rb, line 88
def file_via_connection(path)
  if os.aix?
    Train::File::Remote::Aix.new(self, path)
  elsif os.solaris?
    Train::File::Remote::Unix.new(self, path)
  elsif os.windows?
    Train::File::Remote::Windows.new(self, path)
  else
    Train::File::Remote::Linux.new(self, path)
  end
end
run_command_via_connection(cmd, &_data_handler) click to toggle source
# File lib/train/transports/docker.rb, line 100
def run_command_via_connection(cmd, &_data_handler)
  cmd = @cmd_wrapper.run(cmd) unless @cmd_wrapper.nil?

  # Cannot use os.windows? here because it calls run_command_via_connection,
  # causing infinite recursion during initial platform detection
  if sniff_for_windows?
    invocation = cmd_run_command(cmd)
  else
    invocation = sh_run_command(cmd)
  end
  stdout, stderr, exit_status = @container.exec(
    invocation, user: @options[:user]
  )
  CommandResult.new(stdout.join, stderr.join, exit_status)
rescue ::Docker::Error::DockerError => _
  raise
rescue => _
  # @TODO: differentiate any other error
  raise
end
sh_run_command(cmd) click to toggle source
# File lib/train/transports/docker.rb, line 121
def sh_run_command(cmd)
  ["/bin/sh", "-c", cmd]
end
sniff_for_windows?() click to toggle source
# File lib/train/transports/docker.rb, line 129
def sniff_for_windows?
  return @probably_windows unless @probably_windows.nil?

  # Run a command using /bin/sh, which should fail under Windows
  stdout, _stderr, _exit_status = @container.exec(
    sh_run_command("true"), user: @options[:user]
  )
  @probably_windows = !!stdout.detect { |l| l.include? "failure in a Windows system call" }
end