Class: Docker::Container

Inherits:
Object
  • Object
show all
Includes:
Base
Defined in:
lib/docker/container.rb

Overview

This class represents a Docker Container. It’s important to note that nothing is cached so that the information is always up to date.

Instance Attribute Summary

Attributes included from Base

#connection, #id, #info

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Base

#initialize, #normalize_hash

Class Method Details

.all(opts = {}, conn = Docker.connection) ⇒ Object

Return all of the Containers.



233
234
235
236
# File 'lib/docker/container.rb', line 233

def self.all(opts = {}, conn = Docker.connection)
  hashes = Docker::Util.parse_json(conn.get('/containers/json', opts)) || []
  hashes.map { |hash| new(conn, hash) }
end

.create(opts = {}, conn = Docker.connection) ⇒ Object

Create a new Container.



216
217
218
219
220
221
222
223
# File 'lib/docker/container.rb', line 216

def self.create(opts = {}, conn = Docker.connection)
  name = opts.delete('name')
  query = {}
  query['name'] = name if name
  resp = conn.post('/containers/create', query, :body => opts.to_json)
  hash = Docker::Util.parse_json(resp) || {}
  new(conn, hash)
end

.get(id, opts = {}, conn = Docker.connection) ⇒ Object

Return the container with specified ID



226
227
228
229
230
# File 'lib/docker/container.rb', line 226

def self.get(id, opts = {}, conn = Docker.connection)
  container_json = conn.get("/containers/#{URI.encode(id)}/json", opts)
  hash = Docker::Util.parse_json(container_json) || {}
  new(conn, hash)
end

Instance Method Details

#attach(options = {}, &block) ⇒ Object

Attach to a container’s standard streams / logs.



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/docker/container.rb', line 80

def attach(options = {}, &block)
  stdin = options.delete(:stdin)
  tty   = options.delete(:tty)

  opts = {
    :stream => true, :stdout => true, :stderr => true
  }.merge(options)
  # Creates list to store stdout and stderr messages
  msgs = Docker::Messages.new

  excon_params = {}

  if stdin
    # If attaching to stdin, we must hijack the underlying TCP connection
    # so we can stream stdin to the remote Docker process
    opts[:stdin] = true
    excon_params[:hijack_block] = Docker::Util.hijack_for(stdin, block,
      msgs, tty)
  else
    excon_params[:response_block] = Docker::Util.attach_for(block, msgs, tty)
  end

  connection.post(
    path_for(:attach),
    opts,
    excon_params
  )
  [msgs.stdout_messages, msgs.stderr_messages]
end

#commit(options = {}) ⇒ Object

Create an Image from a Container’s change.s



111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/docker/container.rb', line 111

def commit(options = {})
  options.merge!('container' => self.id[0..7])
  # [code](https://github.com/dotcloud/docker/blob/v0.6.3/commands.go#L1115)
  # Based on the link, the config passed as run, needs to be passed as the
  # body of the post so capture it, remove from the options, and pass it via
  # the post body
  config = options.delete('run')
  hash = Docker::Util.parse_json(connection.post('/commit',
                                                 options,
                                                 :body => config.to_json))
  Docker::Image.send(:new, self.connection, hash)
end

#copy(path, &block) ⇒ Object



207
208
209
210
211
212
213
# File 'lib/docker/container.rb', line 207

def copy(path, &block)
  connection.post(path_for(:copy), {},
    :body => { "Resource" => path }.to_json,
    :response_block => block
  )
  self
end

#exec(command, opts = {}, &block) ⇒ Docker::Exec

Create an Exec instance inside the container

Parameters:

  • command (String, Array)

    The command to run inside the Exec instance

  • options (Hash)

    The options to pass to Docker::Exec

Returns:



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/docker/container.rb', line 41

def exec(command, opts = {}, &block)
  # Establish values
  tty = opts.delete(:tty) || false
  detach = opts.delete(:detach) || false
  stdin = opts.delete(:stdin)
  stdout = opts.delete(:stdout) || !detach
  stderr = opts.delete(:stderr) || !detach

  # Create Exec Instance
  instance = Docker::Exec.create(
    'Container' => self.id,
    'AttachStdin' => !!stdin,
    'AttachStdout' => stdout,
    'AttachStderr' => stderr,
    'Tty' => tty,
    'Cmd' => command
  )

  start_opts = {
    :tty => tty,
    :stdin => stdin,
    :detach => detach
  }

  if detach
    instance.start!(start_opts)
    return instance
  else
    instance.start!(start_opts, &block)
  end
end

#export(&block) ⇒ Object

Export the Container as a tar.



74
75
76
77
# File 'lib/docker/container.rb', line 74

def export(&block)
  connection.get(path_for(:export), {}, :response_block => block)
  self
end

#kill!(opts = {}) ⇒ Object



154
155
156
157
# File 'lib/docker/container.rb', line 154

def kill!(opts = {})
  connection.post(path_for(:kill), opts)
  self
end

#logs(opts = {}) ⇒ Object



137
138
139
# File 'lib/docker/container.rb', line 137

def logs(opts = {})
  connection.get(path_for(:logs), opts)
end

#remove(options = {}) ⇒ Object Also known as: delete

remove container



186
187
188
189
# File 'lib/docker/container.rb', line 186

def remove(options = {})
  connection.delete("/containers/#{self.id}", options)
  nil
end

#run(cmd, time = 1000) ⇒ Object

Given a command and an optional number of seconds to wait for the currently executing command, creates a new Container to run the specified command. If the command that is currently executing does not return a 0 status code, an UnexpectedResponseError is raised.



27
28
29
30
31
32
33
# File 'lib/docker/container.rb', line 27

def run(cmd, time = 1000)
  if (code = tap(&:start).wait(time)['StatusCode']).zero?
    commit.run(cmd)
  else
    raise UnexpectedResponseError, "Command returned status code #{code}."
  end
end

#start!(opts = {}) ⇒ Object



149
150
151
152
# File 'lib/docker/container.rb', line 149

def start!(opts = {})
  connection.post(path_for(:start), {}, :body => opts.to_json)
  self
end

#streaming_logs(opts = {}, &block) ⇒ Object



141
142
143
144
145
146
147
# File 'lib/docker/container.rb', line 141

def streaming_logs(opts = {}, &block)
  msgs = Docker::Messages.new
  excon_params = {response_block: Docker::Util.attach_for(block, msgs, false)}

  connection.get(path_for(:logs), opts, excon_params)
  msgs.all_messages.join
end

#to_sObject

Return a String representation of the Container.



125
126
127
# File 'lib/docker/container.rb', line 125

def to_s
  "Docker::Container { :id => #{self.id}, :connection => #{self.connection} }"
end

#top(opts = {}) ⇒ Object

Return a List of Hashes that represents the top running processes.



7
8
9
10
11
12
13
14
# File 'lib/docker/container.rb', line 7

def top(opts = {})
  resp = Docker::Util.parse_json(connection.get(path_for(:top), opts))
  if resp['Processes'].nil?
    []
  else
    resp['Processes'].map { |ary| Hash[resp['Titles'].zip(ary)] }
  end
end

#wait(time = nil) ⇒ Object

Wait for the current command to finish executing. Default wait time is ‘Excon.options`.



18
19
20
21
# File 'lib/docker/container.rb', line 18

def wait(time = nil)
  resp = connection.post(path_for(:wait), nil, :read_timeout => time)
  Docker::Util.parse_json(resp)
end