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