dockerapi 0.11.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,33 @@
1
1
  module Docker
2
2
  module API
3
+
4
+ ##
5
+ # This class represents a validation error.
3
6
  class ValidationError < StandardError
7
+
8
+ ##
9
+ # @params permitted [Array]: permitted values.
10
+ # @params unpermitted [Array]: unpermitted values.
4
11
  def initialize permitted, unpermitted
5
12
  super("Unpermitted options found: #{unpermitted.to_s}. Permitted are #{permitted.to_s}")
6
13
  end
7
14
  end
15
+
16
+ ##
17
+ # This class represents a parameter validation error.
18
+ class InvalidParameter < Docker::API::ValidationError; end
19
+
20
+ ##
21
+ # This class represents a request body validation error.
22
+ class InvalidRequestBody < Docker::API::ValidationError; end
23
+
24
+ ##
25
+ # This class represents a generic error.
8
26
  class Error < StandardError
9
27
  def initialize msg = "Error without specific message"
10
28
  super(msg)
11
29
  end
12
30
  end
13
-
14
- class InvalidParameter < Docker::API::ValidationError; end
15
- class InvalidRequestBody < Docker::API::ValidationError; end
31
+
16
32
  end
17
33
  end
@@ -1,46 +1,55 @@
1
- module Docker
2
- module API
3
- class Exec < Docker::API::Base
1
+ ##
2
+ # This class represents the Docker API exec related endpoints.
3
+ # @see https://docs.docker.com/engine/api/v1.40/#tag/Exec
4
+ class Docker::API::Exec < Docker::API::Base
4
5
 
5
- def create name, body = {}
6
- validate Docker::API::InvalidRequestBody, [:AttachStdin, :AttachStdout, :AttachStderr, :DetachKeys, :Tty, :Env, :Cmd, :Privileged, :User, :WorkingDir], body
7
- @connection.request(method: :post, path: "/containers/#{name}/exec", headers: {"Content-Type": "application/json"}, body: body.to_json )
8
- end
9
-
10
- def start name, body = {}
11
- validate Docker::API::InvalidRequestBody, [:Detach, :Tty], body
12
-
13
- stream = ""
14
- response = @connection.request(method: :post,
15
- path: "/exec/#{name}/start",
16
- headers: {"Content-Type": "application/json"},
17
- body: body.to_json,
18
- response_block: lambda { |chunk, remaining_bytes, total_bytes| stream += chunk.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?') }
19
- )
20
- response.data.merge!({stream: stream})
21
- response
22
- end
6
+ ##
7
+ # Run a command inside a running container.
8
+ #
9
+ # Docker API: POST /containers/{id}/exec
10
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ContainerExec
11
+ #
12
+ # @param name [String]: The ID or name of the container.
13
+ # @param body [Hash]: Request body to be sent as json.
14
+ def create name, body = {}
15
+ @connection.request(method: :post, path: "/containers/#{name}/exec", headers: {"Content-Type": "application/json"}, body: body.to_json )
16
+ end
23
17
 
24
- def resize name, params = {}
25
- validate Docker::API::InvalidParameter, [:w, :h], params
26
- @connection.post(build_path("/exec/#{name}/resize", params))
27
- end
18
+ ##
19
+ # Starts a previously set up exec instance.
20
+ #
21
+ # Docker API: POST /exec/{id}/start
22
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ExecStart
23
+ #
24
+ # @param name [String]: Exec instance ID.
25
+ # @param body [Hash]: Request body to be sent as json.
26
+ # @param &block: Replace the default output to stdout behavior.
27
+ def start name, body = {}, &block
28
+ @connection.request(method: :post, path: "/exec/#{name}/start", headers: {"Content-Type": "application/json"}, body: body.to_json,
29
+ response_block: block_given? ? block.call : default_streamer )
30
+ end
28
31
 
29
- def details name
30
- @connection.get("/exec/#{name}/json")
31
- end
32
-
33
- #################################################
34
- # Items in this area to be removed before 1.0.0 #
35
- #################################################
36
- def inspect *args
37
- return super.inspect if args.size == 0
38
- warn "WARNING: #inspect is deprecated and will be removed in the future, please use #details instead."
39
- name = args[0]
40
- details(name)
41
- end
42
- #################################################
32
+ ##
33
+ # Resize the TTY session used by an exec instance.
34
+ #
35
+ # Docker API: POST /exec/{id}/resize
36
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ExecResize
37
+ #
38
+ # @param name [String]: Exec instance ID.
39
+ # @param body [Hash]: Request body to be sent as json.
40
+ def resize name, params = {}
41
+ @connection.post(build_path("/exec/#{name}/resize", params))
42
+ end
43
43
 
44
- end
44
+ ##
45
+ # Return low-level information about an exec instance.
46
+ #
47
+ # Docker API: GET /exec/{id}/json
48
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ExecInspect
49
+ #
50
+ # @param name [String]: Exec instance ID.
51
+ def details name
52
+ @connection.get("/exec/#{name}/json")
45
53
  end
54
+
46
55
  end
@@ -1,152 +1,205 @@
1
- require "base64"
2
- require "json"
3
- require 'fileutils'
4
- module Docker
5
- module API
6
- CommitBody = [:Hostname, :Domainname, :User, :AttachStdin, :AttachStdout, :AttachStderr, :ExposedPorts, :Tty, :OpenStdin, :StdinOnce, :Env, :Cmd, :HealthCheck, :ArgsEscaped, :Image, :Volumes, :WorkingDir, :Entrypoint, :NetworkDisabled, :MacAddress, :OnBuild, :Labels, :StopSignal, :StopTimeout, :Shell]
7
- BuildParams = [:dockerfile, :t, :extrahosts, :remote, :q, :nocache, :cachefrom, :pull, :rm, :forcerm, :memory, :memswap, :cpushares, :cpusetcpus, :cpuperiod, :cpuquota, :buildargs, :shmsize, :squash, :labels, :networkmode, :platform, :target, :outputs]
8
- class Image < Docker::API::Base
9
-
10
- def details name
11
- @connection.get(build_path([name, "json"]))
12
- end
13
-
14
- def distribution name
15
- @connection.get("/distribution/#{name}/json")
16
- end
17
-
18
- def history name
19
- @connection.get(build_path([name, "history"]))
20
- end
21
-
22
- def list params = {}
23
- validate Docker::API::InvalidParameter, [:all, :filters, :digests], params
24
- @connection.get(build_path(["json"], params))
25
- end
26
-
27
- def search params = {}
28
- validate Docker::API::InvalidParameter, [:term, :limit, :filters], params
29
- @connection.get(build_path(["search"], params))
30
- end
31
-
32
- def tag name, params = {}
33
- validate Docker::API::InvalidParameter, [:repo, :tag], params
34
- @connection.post(build_path([name, "tag"], params))
35
- end
36
-
37
- def prune params = {}
38
- validate Docker::API::InvalidParameter, [:filters], params
39
- @connection.post(build_path(["prune"], params))
40
- end
41
-
42
- def remove name, params = {}
43
- validate Docker::API::InvalidParameter, [:force, :noprune], params
44
- @connection.delete(build_path([name], params))
45
- end
46
-
47
- def export name, path = "exported_image"
48
- file = File.open("/tmp/exported-image", "wb")
49
- streamer = lambda do |chunk, remaining_bytes, total_bytes|
50
- file.write(chunk)
51
- end
52
- response = @connection.request(method: :get, path: build_path([name, "get"]) , response_block: streamer)
53
- file.close
54
- response.status == 200 ? FileUtils.mv("/tmp/exported-image", File.expand_path(path)) : FileUtils.rm("/tmp/exported-image")
55
- response
56
- end
57
-
58
- def import path, params = {}
59
- validate Docker::API::InvalidParameter, [:quiet], params
60
- file = File.open(File.expand_path(path), "r")
61
- response = @connection.request(method: :post, path: build_path(["load"], params) , headers: {"Content-Type" => "application/x-tar"}, request_block: lambda { file.read(Excon.defaults[:chunk_size]).to_s} )
62
- file.close
63
- response
64
- end
65
-
66
- def push name, params = {}, authentication = {}
67
- validate Docker::API::InvalidParameter, [:tag], params
68
-
69
- if authentication.keys.size > 0
70
- @connection.request(method: :post, path: build_path([name, "push"], params), headers: { "X-Registry-Auth" => Base64.urlsafe_encode64(authentication.to_json.to_s).chomp } )
71
- else
72
- raise Docker::API::Error.new("Provide authentication parameters to push an image")
73
- end
74
- end
75
-
76
- def commit params = {}, body = {}
77
- validate Docker::API::InvalidParameter, [:container, :repo, :tag, :comment, :author, :pause, :changes], params
78
- validate Docker::API::InvalidRequestBody, Docker::API::CommitBody, body
79
- container = Docker::API::Container.new.details(params[:container])
80
- return container if [404, 301].include? container.status
81
- body = JSON.parse(container.body)["Config"].merge(body)
82
- @connection.request(method: :post, path: build_path("/commit", params), headers: {"Content-Type": "application/json"}, body: body.to_json)
83
- end
84
-
85
- def create params = {}, authentication = {}
86
- validate Docker::API::InvalidParameter, [:fromImage, :fromSrc, :repo, :tag, :message, :platform], params
87
-
88
- if authentication.keys.size > 0
89
- auth = Docker::API::System.new.auth(authentication)
90
- return auth unless [200, 204].include? auth.status
91
- @connection.request(method: :post, path: build_path(["create"], params), headers: { "X-Registry-Auth" => Base64.encode64(authentication.to_json.to_s).chomp } )
92
- elsif params.has_key? :fromSrc
93
- if params[:fromSrc].match(/^(http|https)/)
94
- @connection.request(method: :post, path: build_path(["create"], params))
95
- else
96
- file = File.open(File.expand_path(params[:fromSrc]), "r")
97
- params[:fromSrc] = "-"
98
- response = @connection.request(method: :post, path: build_path(["create"], params) , headers: {"Content-Type" => "application/x-tar"}, request_block: lambda { file.read(Excon.defaults[:chunk_size]).to_s} )
99
- file.close
100
- response
101
- end
102
- else
103
- @connection.post(build_path(["create"], params))
104
- end
105
- end
106
-
107
- def build path, params = {}, authentication = {}
108
- raise Docker::API::Error.new("Expected path or params[:remote]") unless path || params[:remote]
109
- validate Docker::API::InvalidParameter, Docker::API::BuildParams, params
110
-
111
- header = {"Content-type": "application/x-tar"}
112
- if authentication.keys.size > 0
113
- authentication.each_key do |server|
114
- auth = Docker::API::System.new.auth({username: authentication[server][:username] ,password:authentication[server][:password], serveraddress: server})
115
- return auth unless [200, 204].include? auth.status
116
- end
117
- header.merge!({"X-Registry-Config": Base64.urlsafe_encode64(authentication.to_json.to_s).chomp})
118
- end
119
-
120
- begin
121
- file = File.open( File.expand_path( path ) , "r")
122
- response = @connection.request(method: :post, path: build_path("/build", params), headers: header, request_block: lambda { file.read(Excon.defaults[:chunk_size]).to_s})
123
- file.close
124
- rescue
125
- response = @connection.request(method: :post, path: build_path("/build", params), headers: header)
126
- end
127
- response
128
- end
129
-
130
- def delete_cache params = {}
131
- validate Docker::API::InvalidParameter, [:all, "keep-storage", :filters], params
132
- @connection.post(build_path("/build/prune", params))
133
- end
134
-
135
- #################################################
136
- # Items in this area to be removed before 1.0.0 #
137
- #################################################
138
- def base_path
139
- "/images"
140
- end
141
-
142
- def inspect *args
143
- return super.inspect if args.size == 0
144
- warn "WARNING: #inspect is deprecated and will be removed in the future, please use #details instead."
145
- name = args[0]
146
- details(name)
147
- end
148
- #################################################
1
+ ##
2
+ # This class represents the Docker API endpoints regarding images.
3
+ # @see https://docs.docker.com/engine/api/v1.40/#tag/Image
4
+ class Docker::API::Image < Docker::API::Base
5
+
6
+ ##
7
+ # Return low-level information about an image.
8
+ #
9
+ # Docker API: GET /images/{name}/json
10
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageInspect
11
+ #
12
+ # @param name [String]: The ID or name of the image.
13
+ def details name
14
+ @connection.get("/images/#{name}/json")
15
+ end
16
+
17
+ ##
18
+ # Return image digest and platform information by contacting the registry.
19
+ #
20
+ # Docker API: GET /distribution/{name}/json
21
+ # @see https://docs.docker.com/engine/api/v1.40/#tag/Distribution
22
+ #
23
+ # @param name [String]: The ID or name of the image.
24
+ def distribution name
25
+ @connection.get("/distribution/#{name}/json")
26
+ end
27
+
28
+ ##
29
+ # Return parent layers of an image.
30
+ #
31
+ # Docker API: GET /images/{name}/history
32
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageHistory
33
+ #
34
+ # @param name [String]: The ID or name of the image.
35
+ def history name
36
+ @connection.get("/images/#{name}/history")
37
+ end
38
+
39
+ ##
40
+ # Returns a list of images on the server. Note that it uses a different, smaller representation of an image than inspecting a single image.
41
+ #
42
+ # Docker API: GET /images/json
43
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageList
44
+ #
45
+ # @param params [Hash]: Parameters that are appended to the URL.
46
+ def list params = {}
47
+ @connection.get(build_path("/images/json", params))
48
+ end
49
+
50
+ ##
51
+ # Search for an image on Docker Hub.
52
+ #
53
+ # Docker API: GET /images/search
54
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageSearch
55
+ #
56
+ # @param params [Hash]: Parameters that are appended to the URL.
57
+ def search params = {}
58
+ @connection.get(build_path("/images/search", params))
59
+ end
60
+
61
+ ##
62
+ # Tag an image so that it becomes part of a repository.
63
+ #
64
+ # Docker API: POST /images/{name}/tag
65
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageTag
66
+ #
67
+ # @param name [String]: The ID or name of the image.
68
+ # @param params [Hash]: Parameters that are appended to the URL.
69
+ def tag name, params = {}
70
+ @connection.post(build_path("/images/#{name}/tag", params))
71
+ end
72
+
73
+ ##
74
+ # Delete unused images.
75
+ #
76
+ # Docker API: POST /images/prune
77
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImagePrune
78
+ #
79
+ # @param params [Hash]: Parameters that are appended to the URL.
80
+ def prune params = {}
81
+ @connection.post(build_path("/images/prune", params))
82
+ end
83
+
84
+ ##
85
+ # Remove an image, along with any untagged parent images that were referenced by that image.
86
+ #
87
+ # Images can't be removed if they have descendant images, are being used by a running container or are being used by a build.
88
+ #
89
+ # Docker API: DELETE /images/{name}
90
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageDelete
91
+ #
92
+ # @param name [String]: The ID or name of the image.
93
+ # @param params [Hash]: Parameters that are appended to the URL.
94
+ def remove name, params = {}
95
+ @connection.delete(build_path("/images/#{name}", params))
96
+ end
97
+
98
+ ##
99
+ # Export an image.
100
+ #
101
+ # Docker API: GET /images/{name}/get
102
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageGet
103
+ #
104
+ # @param name [String]: The ID or name of the image.
105
+ # @param path [String]: Path to the exported file.
106
+ # @param &block: Replace the default file writing behavior.
107
+ def export name, path, &block
108
+ @connection.request(method: :get, path: build_path("/images/#{name}/get") , response_block: block_given? ? block.call : default_writer(path))
109
+ end
110
+
111
+ ##
112
+ # Import images.
113
+ #
114
+ # Docker API: POST /images/load
115
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageLoad
116
+ #
117
+ # @param name [String]: The ID or name of the image.
118
+ # @param params [Hash]: Parameters that are appended to the URL.
119
+ def import path, params = {}
120
+ default_reader(path, build_path("/images/load", params))
121
+ end
122
+
123
+ ##
124
+ # Push an image to a registry.
125
+ #
126
+ # Docker API: POST /images/{name}/push
127
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImagePush
128
+ #
129
+ # @param name [String]: The ID or name of the image.
130
+ # @param params [Hash]: Parameters that are appended to the URL.
131
+ # @param authentication [Hash]: Authentication parameters.
132
+ def push name, params = {}, authentication = {}
133
+ raise Docker::API::Error.new("Provide authentication parameters to push an image") unless authentication.keys.size > 0
134
+ @connection.request(method: :post, path: build_path("/images/#{name}/push", params), headers: { "X-Registry-Auth" => auth_encoder(authentication) } )
135
+ end
149
136
 
137
+ ##
138
+ # Create a new image from a container.
139
+ #
140
+ # Docker API: POST /commit
141
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageCommit
142
+ #
143
+ # @param params [Hash]: Parameters that are appended to the URL.
144
+ # @param body [Hash]: Request body to be sent as json.
145
+ def commit params = {}, body = {}
146
+ container = Docker::API::Container.new.details(params[:container])
147
+ return container if [404, 301].include? container.status
148
+ @connection.request(method: :post, path: build_path("/commit", params), headers: {"Content-Type": "application/json"}, body: container.json["Config"].merge(body).to_json)
149
+ end
150
+
151
+ ##
152
+ # Create an image by either pulling it from a registry or importing it.
153
+ #
154
+ # Docker API: POST /images/create
155
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageCreate
156
+ #
157
+ # @param params [Hash]: Parameters that are appended to the URL.
158
+ # @param authentication [Hash]: Authentication parameters.
159
+ # @param &block: Replace the default output to stdout behavior.
160
+ def create params = {}, authentication = {}, &block
161
+ request = {method: :post, path: build_path("/images/create", params), response_block: block_given? ? block.call : default_streamer }
162
+ if params.has_key? :fromSrc and !params[:fromSrc].match(/^(http|https)/) # then it's using a tar file
163
+ path = params[:fromSrc]
164
+ params[:fromSrc] = "-"
165
+ default_reader(path, build_path("/images/create", params))
166
+ else
167
+ request[:headers] = { "X-Registry-Auth" => auth_encoder(authentication) } if authentication.keys.size > 0
168
+ @connection.request(request)
150
169
  end
151
170
  end
171
+
172
+ ##
173
+ # Build an image from a tar archive with a Dockerfile in it.
174
+ #
175
+ # Docker API: POST /build
176
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/ImageBuild
177
+ #
178
+ # @param path [String]: Path to the tar file.
179
+ # @param params [Hash]: Parameters that are appended to the URL.
180
+ # @param authentication [Hash]: Authentication parameters.
181
+ # @param &block: Replace the default output to stdout behavior.
182
+ def build path, params = {}, authentication = {}, &block
183
+ raise Docker::API::Error.new("Expected path or params[:remote]") unless path || params[:remote]
184
+
185
+ headers = {"Content-type": "application/x-tar"}
186
+ headers.merge!({"X-Registry-Config": auth_encoder(authentication) }) if authentication.keys.size > 0
187
+
188
+ if path == nil and params.has_key? :remote
189
+ response = @connection.request(method: :post, path: build_path("/build", params), headers: headers, response_block: block_given? ? block.call : default_streamer)
190
+ else
191
+ default_reader(path, build_path("/build", params), headers)
192
+ end
193
+ end
194
+
195
+ ##
196
+ # Delete builder cache.
197
+ #
198
+ # Docker API: POST /build/prune
199
+ # @see https://docs.docker.com/engine/api/v1.40/#operation/BuildPrune
200
+ #
201
+ # @param params [Hash]: Parameters that are appended to the URL.
202
+ def delete_cache params = {}
203
+ @connection.post(build_path("/build/prune", params))
204
+ end
152
205
  end